LeetCode1. Two Sum

题目 

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

考点

On,要用hash查找,不然暴力会超时,用unordered_map无序(hash,不是map(有序,红黑树).


思路


代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        if(nums.empty())
        return nums;
        vector<int> ret; 
        unordered_map<int,int> map;//这里要用无序查找
        int i = 0;
        while(!nums.empty())        
        {
            int key=*nums.begin();
            map[key]=target-key;
            nums.erase(nums.begin());//这里删了一个元素,loop里面会迭代两次,所以不能用for(auto :)
            int j = i+1;
            for(auto val : nums)
            {
                if(val==map[key])
                    {
                        ret.push_back(i);
                        ret.push_back(j);
                        return ret;
                    }
                    j++;
            }           
            i++; 
        }
        return ret;
    }
};

法2 , 将数组值作为key,索引作为val,用无序映射的find(key)方法来查找,find返回it。it的第一个值是key,第二个值是val


class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int> hash;
        
        for (int i = 0; i < nums.size(); i++) {
            auto iter = hash.find(target - nums[i]);//用hash.find进行key-value映射查找

            if (iter != hash.end()) {
                return vector{iter->second, i};//it.first==key,it.second==val
            };
            hash[nums[i]] = i;//单值映射
        }
        return vector<int>();
    }
};

 法3.map自带方法count。证明 有这个key存在。直接返回map[key]就是索引了。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
 
        unordered_map<int,int> map;

        for(int i =0; i <nums.size();i++)
        {
            if(map.count(target-nums[i]))
            return {i,map[target-nums[i]]};
            map[nums[i]]=i;
        }
        return {};
    }
};

问题

ref:

c++中map与unordered_map的区别

posted @ 2019-02-22 23:35  lightmare  阅读(...)  评论(... 编辑 收藏