Two Numbers

来源:互联网 发布:maxwell仿真软件下载 编辑:程序博客网 时间:2024/06/05 18:12

leetcode第一题,题目还是比较简单的,在一个序列中找出两个数相加等于所给的目标数,而且题目很明确给出了肯定存在这样一对数字,且只有一组。

最朴素的想法:进行两边循环遍历。

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        vector<int> ans;        for(int i  = 0;i < nums.size();i++){            for (int j = i+1;j < nums.size();j++ ){                if (nums[i]+nums[j] == target){                    ans.push_back(i);                    ans.push_back(j);                    return ans;                }            }        }        return ans;        }  };
这样的复杂度为o(n2),实际测试用了700多ms,有没有更好地办法呢?

朴素的改进办法:第一遍循环是在遍历,第二遍循环是在做什么呢?很显然是在寻找能和第一个循环中的变量凑成目标数的数值,这个寻找就是可以做手脚的地方,可以不一个个的找,而是借助于hashmap来找,这里使用的是c++中的unordered_map,hashmap可以快速查找,因此可以迅速提高速度。

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

这里的主要思路是,在外层循环中遍历整个数组,然后分别求一下能与之配对成目标数的“”补数“”,将这个“”补数“”作为键值,索引作为值存入hash,当继续遍历发现hash表中存在了“补数”,也就拿到了对应的索引。寻找方法用的是hashmap的find方法,如果找到它会返回一个迭代器,否则返回迭代器的end,如果该数与剩余数字都凑不成目标数,则把它加入索引对。

补一发python版本的,基本思路与c++的hashmap差不多,不过我使用的是字典,python中的字典貌似也是红黑树实现的,因此查询效率也很高。

class Solution(object):    def twoSum(self, nums, target):        """        :type nums: List[int]        :type target: int        :rtype: List[int]        """        ans = []        hash = {}        for index,num in enumerate(nums):        other = target-num        if num not in hash:            hash[other] = index        else:            return [hash[num],index]                        






0 0