1. 程式人生 > >leetcode 1 兩數之和

leetcode 1 兩數之和

mar 最快 兩數之和 AS In n) 兩個 目標 不能

題目

給定一個整數數組和一個目標值,找出數組中和為目標值的兩個數。

你可以假設每個輸入只對應一種答案,且同樣的元素不能被重復利用。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解題思路

1、最簡單做法,遍歷所有情況,復雜度O(n2)
2、先排序,頭尾加兩個指針,向中間移動,若指針和小於target,則尾指針前移,若指針和大於target,則頭指針後移,復雜度取決於排序算法,最快O(nlogn)
3、不排序,用hash存每個數出現的次數,第一次遍歷找出num1,判斷條件是target-num1存在且不為同一個num1,如:(3,2,4),target為6,num1為3,target-num1也為3,同一個3就不行。但是如:(3,3),target為6,則num1的3和target-num1的3不為同一個,即可;第二次遍歷,找出target-num1的位置,若遇到num1直接跳過,避免重復的情況發生(題目要求同樣元素不能重復利用)。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i,len = nums.size();
        map<int, int> mark;
        mark.clear();
        for(i=0; i<len; ++i) {
            mark[nums[i]] ++;
        }
        int le, ri;
        for(i=0; i<len; ++i) {
            mark[nums[i]] --;
            if(mark[target - nums[i]]) {
                le = i;
                break;
            }
            mark[nums[i]] ++;
        }
        for(i=0; i<len; ++i) {
            if(i == le) continue;
            if(nums[i] == target-nums[le]) {
                ri = i;
                break;
            }
        }
        vector<int> v;
        v.push_back(le);
        v.push_back(ri);
        return v;
    }
};

leetcode 1 兩數之和