NC61.两数之和

class Solution {
public:
    /**
     * 
     * @param numbers int整型vector 
     * @param target int整型 
     * @return int整型vector
     */
    vector<int> twoSum(vector<int>& numbers, int target) {
        // write code here
        std::vector<int> ans;
        std::unordered_map<int, int> map;
        std::unordered_map<int, int>::iterator itor;
        int sz = numbers.size();
        for (int i = 0; i < sz; ++i) {
            itor = map.find(numbers[i]);
            if (itor != map.end()) {
                ans.emplace_back(itor->second + 1);
                ans.emplace_back(i + 1);
                break;
            }
            map.insert(std::pair<int, int>(target - numbers[i], i));
        }
        
        return ans;
    }
};

解题思路:

难点1:能否想到用Hash表来做映射,能想到这道题基本就能做出来;

难点2:Hash表里存什么很重要。完全将数组丢进Hash表,将Hash表当做数组的一个快速检索索引也能做;更优的办法是,边遍历数组,边将差丢入Hash表,这样Hash表就是个结果集,更加快速;

知识点:

知识点1:unordered_map与map的区别,前者是Hash表,时间复杂度近似常数,后者实现原理是红黑树,时间复杂度是lgN;

知识点2:map迭代器的声明:

std::unordered_map<int, int>::iterator itor; 

知识点3:map中寻找某个key是否存在,使用以下方法

itor = map.find(number);
if (itor != map.end()) {
	//...
}

知识点4:map的KV插入,使用以下方法最为高效

map.insert(std::pair<int, int>(i, j));

知识点5:map通过迭代器取值

int i = itor->first;
int j = itor->second;