leetcode 1 兩數之和
阿新 • • 發佈:2018-06-23
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 兩數之和