Leetcode--Two Sum

来源:互联网 发布:淘宝旅行日历js插件 编辑:程序博客网 时间:2024/06/15 09:35

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

看到这一题的直接思路是时间复杂度为O(n²)的双循环解法,设置两个index(index1和index2)分别作为外循环和内循环的循环变量,直到找到数组A中的两个数之和等于target为止,代码如下:

class Solution {public:    vector<int> twoSum(vector<int> &numbers, int target) {        vector<int> result;        size_t index1 = 0,index2 = 0;        for (index1=0;index1<numbers.size()-1;index1++){            for (index2=index1+1;index2<numbers.size();index2++){                if (numbers[index1]+numbers[index2]==target){                    result.push_back(index1+1);                    result.push_back(index2+1);                    return result;                }            }        }    }};

显然这种算法时间复杂度太高,提交之后给出超时错误,所以要对算法进行修改。在这里可以建立一个哈希表unordered_set<int,int> key表示target和当前数字的差值,value是指当前数字的index,这样算法的时间复杂度就变为O(n),节省的主要原因是利用了哈希表的查找时间复杂度为常数时间,所以将之前的双循环变为单循环,AC代码如下:

class Solution {public:    vector<int> twoSum(vector<int> &numbers, int target) {        unordered_map<int,int> mymap;vector<int> result;for (int i = 0;i < numbers.size();i++){if (mymap.find(numbers[i]) == mymap.end()){mymap[target-numbers[i]] = i;}else{int index1 = ( (mymap[numbers[i]] < i) ? mymap[numbers[i]] : i )+1;int index2 = ( (mymap[numbers[i]] > i) ? mymap[numbers[i]] : i )+1;result.push_back(index1);result.push_back(index2);break;}}return result;    }};
代码解释:mymap中用来保存target和当前数字的差值,如果在后面的循环中在数组中找到与哈希表中相同的数字,则找到了目标。以题目例子为例,

Input: numbers={2, 7, 11, 15}, target=9。当i=0,此时mymap为空,mymap中填入<7,0>,然后i=1,在mymap中寻找7,此时可以找到,这个时候的index1和index2就是mymap[7]的value和i,这个时候只需要比较这两个数的大小就可以确定index1和index2。






0 0
原创粉丝点击