L1:
無序數組找出相加爲target的兩個數
特徵:無序、無重複、每個元素只能用一次、有且只有一組答案
Tag:O(n) hashmap
解:
Step1:hashmap中,key存儲number,value存儲index。
Step2:在hashmap的key中尋找 target-number。只需常數時間。
Step3:一邊建表一邊比較。如果找到,return;如果沒找到,將其編入表中。
坑:
不能先建立hashmap完整hashmap之後再逐一比較。因爲不可避免同一個元素找到自己。
例如:[3,4,2], target=6。會返回下標[0,0]。
L167:
有序數組找出相加爲target的兩個數。
特徵:有序、無重複、每個元素只能用一次、有且只有一組答案
Tag:O(n) Two Pointers
解:
一個指針放head,一個指針放tail,
如果nums[head]+nums[tail]<target,則head++; 否則,則tail--
遍歷直到head==tail。
注:
語法。
Vector<int> result {head+1,tail+1}
Return result;
L15: 3sum
無序數組找出三個數,這三個數相加爲0。
特徵:無序、有重複、有多組答案
Tag:O(n^2) Two pointers
解:
此題思路在於固定一個數之後,剩下後面的數組可以參考2sum的方法,target爲0-num[i]。
Step0:empty check
Step1:排序
Step2:選定固定的數
Step3:2sum求解
坑:
重複問題。
首先,固定的那個數的重複問題。解決思路爲while循環直到下一個不同的數出現,注意要將第一個存入。
Case[0,0,0,0,0]
其次,head和tail的值不能相同。判斷重複後,用while一直找到不同的head和tail。
Case[-1,-1,0,0,1,1]