leetcode 1.两数之和

这个作为第一道题。暴力解法还是很简单的。

快速的解法是建立字典,用O(n)的空间代价将时间代价从O(n^2)下降到O(n)。

我是用c++实现。这里需要注意,在对顺序性没有要求,并且需要更好的查找性能的时候,推荐使用unordered_map而非map。

实现代码如下

class Solution {
public:
    vector<int> twoSum(vector<int> &nums, int target) {
        int i, j = 0;
        unordered_map<int, int> V2Index;
        for (i = 0; i < nums.size(); i++) {
            V2Index[nums[i]] = i;
        }
        for (i = 0; i < nums.size(); i++) {
            auto search = V2Index.find(target - nums[i]);
            if (search != V2Index.end() && V2Index[target - nums[i]] != i) {
                vector<int> ans = {i, search->second};
                return ans;
            }
        }
        vector<int> ans;
        return ans;
    }
};

 

稍微一个小优化,不需要建立完整的字典后再去搜索,而是每插入一个键值对就搜索一次。从leetcode的测试结果来看,时间优化效果比改动前好很多。这是考虑到平均时间复杂度。

class Solution {
public:
    vector<int> twoSum(vector<int> &nums, int target) {
        int i, j = 0;
        unordered_map<int, int> V2Index;
        for (i = 0; i < nums.size(); i++) {
            auto search = V2Index.find(target - nums[i]);
            if (search != V2Index.end() && V2Index[target - nums[i]] != i) {
                vector<int> ans = {i, search->second};
                return ans;
            }
            V2Index[nums[i]] = i;
        }
        vector<int> ans;
        return ans;
    }
};

 

posted @ 2020-08-19 11:04  布羽  阅读(83)  评论(0)    收藏  举报