leetcode18. 4Sum
来源:互联网 发布:linux vsftpd匿名用户 编辑:程序博客网 时间:2024/05/29 03:38
题目
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note: The solution set must not contain duplicate quadruplets.
For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.A solution set is:[ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2]]
思路
在原来3sum的基础上面加一层循环
代码
public class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { ArrayList<List<Integer>> res = new ArrayList<List<Integer>>(); if(nums.length < 4){ return res; } Arrays.sort(nums); int len = nums.length; int max = nums[len - 1]; if(nums[0] * 4 > target || max * 4 < target){ return res; } int t; for( int i = 0; i < len - 3; i ++){ t = nums[i]; if(i > 0 && t == nums[i - 1]) continue; if(4 * t > target) break; if(4 * t == target && i < len - 3&& nums[i + 3] == t){ res.add(Arrays.asList(t, t, t, t)); continue; } threeSum(nums, target - t, i+1, len, res, t); } return res; } public void threeSum(int[] nums, int target, int lo, int hi, List<List<Integer>> res, int t) { for(int i = lo; i < hi- 2; i++){ if(i == lo || ( nums[i] != nums[i-1])){ int low = i+1;int high = nums.length - 1; int iSum = target - nums[i]; while(low < high){ if(nums[low] + nums[high] == iSum){ res.add(Arrays.asList(t, nums[i], nums[low], nums[high])); while(low < high && nums[low] == nums[low + 1]) low++; while(low < high && nums[high] == nums[high - 1]) high--; low++; high--; } else if( nums[low] + nums[high] > iSum){ high--; } else{ low++; } } } } }}
他山之玉
public List<List<Integer>> fourSum(int[] nums, int target) { ArrayList<List<Integer>> res = new ArrayList<List<Integer>>(); int len = nums.length; if (nums == null || len < 4) return res; Arrays.sort(nums); int max = nums[len - 1]; if (4 * nums[0] > target || 4 * max < target) return res; int i, z; for (i = 0; i < len; i++) { z = nums[i]; if (i > 0 && z == nums[i - 1])// avoid duplicate continue; if (z + 3 * max < target) // z is too small continue; if (4 * z > target) // z is too large break; if (4 * z == target) { // z is the boundary if (i + 3 < len && nums[i + 3] == z) res.add(Arrays.asList(z, z, z, z)); break; } threeSumForFourSum(nums, target - z, i + 1, len - 1, res, z); } return res; } /* * Find all possible distinguished three numbers adding up to the target * in sorted array nums[] between indices low and high. If there are, * add all of them into the ArrayList fourSumList, using * fourSumList.add(Arrays.asList(z1, the three numbers)) */ public void threeSumForFourSum(int[] nums, int target, int low, int high, ArrayList<List<Integer>> fourSumList, int z1) { if (low + 1 >= high) return; int max = nums[high]; if (3 * nums[low] > target || 3 * max < target) return; int i, z; for (i = low; i < high - 1; i++) { z = nums[i]; if (i > low && z == nums[i - 1]) // avoid duplicate continue; if (z + 2 * max < target) // z is too small continue; if (3 * z > target) // z is too large break; if (3 * z == target) { // z is the boundary if (i + 1 < high && nums[i + 2] == z) fourSumList.add(Arrays.asList(z1, z, z, z)); break; } twoSumForFourSum(nums, target - z, i + 1, high, fourSumList, z1, z); } } /* * Find all possible distinguished two numbers adding up to the target * in sorted array nums[] between indices low and high. If there are, * add all of them into the ArrayList fourSumList, using * fourSumList.add(Arrays.asList(z1, z2, the two numbers)) */ public void twoSumForFourSum(int[] nums, int target, int low, int high, ArrayList<List<Integer>> fourSumList, int z1, int z2) { if (low >= high) return; if (2 * nums[low] > target || 2 * nums[high] < target) return; int i = low, j = high, sum, x; while (i < j) { sum = nums[i] + nums[j]; if (sum == target) { fourSumList.add(Arrays.asList(z1, z2, nums[i], nums[j])); x = nums[i]; while (++i < j && x == nums[i]) // avoid duplicate ; x = nums[j]; while (i < --j && x == nums[j]) // avoid duplicate ; } if (sum < target) i++; if (sum > target) j--; } return; }
阅读全文
0 0
- [LeetCode18]4Sum
- LeetCode18:4Sum
- leetcode18 4sum
- LeetCode18:4Sum
- [LeetCode18]4Sum
- LeetCode18. 4Sum
- leetcode18. 4Sum
- leetcode18:4Sum
- leetcode18~4Sum
- LeetCode18. 4Sum
- leetcode18. 4Sum
- leetcode18. 4Sum
- leetcode18 4Sum
- leetcode18. 4Sum
- LeetCode18. 4Sum
- leetcode18:4Sum(15-10-6)
- Leetcode1.Two Sum+LeetCode15.3Sum+LeetCode18. 4Sum【K-Sum问题】
- leetcode18
- WEB基础,select触发事件,获取option自定义属性的值
- Tensorflow学习笔记2:About Session, Graph, Operation and Tensor
- 2017.06.13牛客网第一天Java试题学习
- ANDROID MANIFEST.XML中的META-DATA属性
- K-近邻算法
- leetcode18. 4Sum
- python第23篇之--列表操作
- 创建FFOS 应用
- 红黑树插入操作
- Android 自定义View (二) 进阶
- 构造函数与析构函数的比较
- Android——Luban图片压缩算法学习
- Max Sum Plus Plus HDU
- 【简记】Computer Networking——network layer(part two)