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]