经典的two/three sum算法
哈希法
请输入代码
two pointers方法
请输入代码
two/three sum的变形问题
关于three sum问题要做的和不要做的
应该做的
第一个应该想到的方法是暴力解法,N integer就是N重循环,这是unacceptable solution,但是it's natural
如果想使用two pointers而不是哈希的方法,那么一定要先sort array
如果题目要求返回value不重复的pair/triple,那么一定要用HashSet 去重
在while loop的condition判定中,无论哪种condition,一定都要更新pointer,否则会陷入死循环
不应该做的
如果是返回结果和index有关或者题目本身条件判定和index有关,那么不建议使用two pointers方法,因为在sort array的时候original index信息会丢失(尽管我们可以用wrapper class把original index信息放进去,但是那样代码会复杂一些),这时哈希方法可能会更好
如果while loop里头的condition判定条件可以i++或者j--(或者说 i++ 和j--都必须尝试),那么这种方法不建议使用,因为无法判断下一步的操作。这时候可以尝试anchor不一样的index,如果现在是把第一个index anchor住,那么可以考虑把最后一个anchor,使得最后没有任何的“歧义”。
Triangle Count :Given an array of integers, how many three numbers can be found in the array, so that we can build an triangle whose three edges length is the three numbers that we find?Given array S = [3,4,6,7], return 3. They are:[3,4,6][3,6,7][4,6,7]Given array S = [4,4,4,4], return 4. They are:[4(1),4(2),4(3)][4(1),4(2),4(4)][4(1),4(3),4(4)][4(2),4(3),4(4)]public int triangleCount(int S[]) { // write your code here int res = 0; if(S.length == 0 || S == null) return res; Arrays.sort(S); for(int i = S.length - 1; i > 0; i--) { int l = 0; int r = i - 1; while(l < r) { if(S[l] + S[r] > S[i]){ res += (r-l); r--; } else l++; } } return res; }