two Sum leetCode第一题

来源:互联网 发布:调度软件 编辑:程序博客网 时间:2024/05/16 15:25

题目描述:

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=9Output: index1=1, index2=2
题目tags为:Array   Hash Table

思路:

最原始的方法就是使用组合的思想,使用一个嵌套循环,让一个元素与其之后的每个元素都加一次,判断是否与target相等

vector<int> Solution::twoSum(vector<int> &nums, int target){int vSize = nums.size();int index = 0;int num, tmp;vector<int> vResult;int i, j;for (i=0; i<vSize; ++i){for (j=i+1; j<vSize; ++j){if (nums[i] + nums[j] == target){vResult.push_back(i + 1);vResult.push_back(j + 1);//cout << "index1=" << i << ", index2=" << j <<endl;}}}return vResult;}
该方法的时间复杂度是O(n^2),提交上去是会超时的

使用map,在nums这个vector中查找的同时,将其插入到map中,向map中插入时是将nums[i]作为key,将下标i作为value,代码为:

class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        int vSize = nums.size();    int index = 0;    int num, tmp;    vector<int> vResult;        map<int,int> tmpMap;        for (index = 0; index < vSize; ++index)    {    tmp = nums[index];        num = tmpMap.count(target - tmp);    if (0 != num)    {    map<int,int>::iterator mapIter = tmpMap.find(target - tmp);    vResult.push_back(mapIter->second + 1);    vResult.push_back(index+1);    }        num = tmpMap.count(tmp);    if (0 == num)    {    tmpMap.insert(pair<int,int>(nums[index],index));    }            }    return vResult;        }};
首先判断target - nums[index]是否在tmpMap中,如果该值为tmpMap中,则index和target - nums[index]所对应的下标就是所需要的结果;否则,则将nums[index]存入到tmpMap中。关于这样写的原因如下:

  1. 为啥要使用map:因为在map中查找某个值的复杂度比较小,为logN
  2. 为啥要先判断target - nums[index]是否在tmpMap中:在提交时遇到这么一组数据:3,2,4;target为6。如果要按照先判断nums[index]是否在tmpMap中,不在tmpMap中则将nums[index]和index插入到map中,然后再判断target - nums[index]是否在tmpMap中。这样的话,tepMap为空,3不在map中,然后插入3,再判断6-3=3是否在map中,由于刚刚插入了一个3,所以现在6-3=3就在map中了,这样就会导致一个错误的结果
  3. 为啥mapIter->second就比index要大:由于target为nums中的两个下标不同的元素的和(这两个下标在本文中先记为i1和i2),并且循环是从0~vSize,当遍历到nums[i1]时,此时target - nums[i1] (其值与nums[i2]相同)还未被插入到map中,因此会执行insert操作,将nums[i1]插入到map中,当再遍历到nums[i2]时,此时target - nums[i2] (其值与nums[i1]相同,并且nums[i1]已存在于map中)会被找到,所以也就操作完成了
另外一个思路是边查找边建立AVL树,下一步就去实现……



0 0
原创粉丝点击