各种3sum 4sum
来源:互联网 发布:java 首字母小写 编辑:程序博客网 时间:2024/05/16 16:14
这两天做了3sum, 3sum closest, 4sum
一个模板就是先sort array, 取一个或两个下标(depend on 3sum or 4sum)然后用另外两个指针指向头和尾。由于数组已经排序,只需要这两个指针扫一遍。
教训:当sum == target时,经常忘记移动两个下标(k,l),使得死循环或者不再去判断k+1到l-1之间的数组。
2015.1 update:
对于有重复数字的情况,方法就是在每次循环后将下标一直移动到不重复的地方。注意不可以在循环前判断,比如{0,0,0,0}, 0 这样的情况就会返回空,因为第二层循环发现自己与前一个数字一样就会跳过。
public List<List<Integer>> fourSum(int[] num, int target) { Arrays.sort(num); List<List<Integer>> result = new ArrayList<List<Integer>>(); for (int i = 0; i < num.length-3; i++) { if (i > 0 && num[i] == num[i-1]) { continue; } for (int j = i+1; j < num.length-2; j++) { int twoSum = target - num[i] - num[j]; int p = j+1; int q = num.length-1; while(p < q) { if (num[p] + num[q] == twoSum) { List<Integer> list = new ArrayList<Integer>(); list.add(num[i]); list.add(num[j]); list.add(num[p]); list.add(num[q]); result.add(list); p++; q--; while (p < q && num[p] == num[p-1]) { p++; } while (p < q && num[q] == num[q+1]) { q--; } } else if (num[p] + num[q] < twoSum) { p++; } else { q--; } } while (j < num.length-2 && num[j] == num[j+1]) { j++; } } } return result; }
0 0
- 各种3sum 4sum
- 2sum 3sum 4sum 各种sum
- 3Sum 3Sum Closest 4Sum
- 3Sum & 3Sum Closest & 4Sum
- 3sum、3Sum closet、 4sum
- 3Sum, 3Sum Closest, 4 Sum
- leetcode 2 sum 3sum 4sum
- 2Sum 3Sum 4Sum
- Leetcode 2SUM-3SUM-4SUM
- Leetcode-2sum,3sum,4sum
- leetcode 2 sum & 3 sum & 4 sum
- [LeetCode] 2Sum, 3Sum, 4Sum, 3SUm closet
- Two Sum & 3Sum & 3Sum Closest & 4Sum
- Two Sum,3Sum,3Sum Closest,4Sum
- [LeetCode] K sum(2Sum、3Sum、4Sum)
- leetcode--sum集合:2sum,3sum,4sum
- leetcode --- 2 sum , 3 sum , 4 sum , k sum problem
- 2-sum, 3-sum, 4-sum and n-sum
- 两个指针-Remove duplicates of linked list
- Reverse Nodes in k-Group
- 关于链表的一点总结
- 黑马程序员——交通灯管理系统
- ICAN业务流程外包是在CRMservices的专业领导机构
- 各种3sum 4sum
- 两个指针-Trapping Rain
- 两个指针-sort colors
- 开始研究二叉树
- 二叉树-循环遍历
- 二叉树求大和最小depth
- 经验总结25--释放内存的重要性
- 二叉树-对称树
- ibm的InfoSphere Streams的制备技术指南精通测试V1