2 Sum-LintCode

来源:互联网 发布:韩顺平java视频有用吗 编辑:程序博客网 时间:2024/05/17 05:54

问题描述:

给一堆数组和一个目标值,在这堆数组里面找出两个数使得他们的和等于目标值。


解题思路:

思路一:
蛮力算法,两个循环,依次计算x + y = target ?是否成立,若成立则输出,否则继续,直到循环结束。时间复杂度:O(n^2)


思路二:
既然是需要找两个数使得他们的和等于目标值,
查找——第一反应是hash 或者 二分。
这里hash 会加快查找的速度。

首先第一步,用for循环扫描一遍我们的数组,并且hash表存储在扫到第i个数的时候,前面扫过的i-1个数已经存储在hash表之中。
这样,我们在扫描第i个元素的时候,在前i-1个元素中查找是否有某个元素与 当前第i个元素相加等于目标值。即查找前面i-1个元素中有没有值为:target-ai 的数。
时间复杂度:O(n),空间复杂度:O(n)


思路三:
双指针法则,前后两个指针。
首先将数组排序。
然后,设置两个指针,一前一后 pre 和 end。
依次比较 A[pre] + A[end] 与 target 值大小。
若 大于target,则 end向前移动;
若 小于target,则 pre向后移动 ;
若相等,则输出,结束。
若 pre == end 则结束。


思路二参考代码:

class Solution {public:    /*     * @param numbers : An array of Integer     * @param target : target = numbers[index1] + numbers[index2]     * @return : [index1+1, index2+1] (index1 < index2)     */    vector<int> twoSum(vector<int> &nums, int target) {        unordered_map<int, int> hash;        vector<int> result;        for (int i = 0; i < nums.size(); i++) {            if (hash.find(target - nums[i]) != hash.end()) {                result.push_back(hash[target - nums[i]] + 1);                result.push_back(i + 1);                return result;            }            hash[nums[i]] = i;        }    }};

参考资料:http://www.jiuzhang.com/problem/67/

0 0
原创粉丝点击