java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
- 此题为三数之和的衍生题,代码完全一样,只不过多了一层for循环,而多的这一层for循环,也只不过是再复制一份三数之和的for循环罢了
🏆LeetCode15. 三数之和https://blog.csdn.net/grd_java/article/details/136010556 |
---|
- 思路和三数之和完全一样,先排序。然后枚举数组左边界,作为第一个数
- 然后因为多了一个数,所以我们使用同样的代码,枚举剩余3个数的左边界,作为第二个数
- 然后在3个数的左边界,右边区域,使用双指针进行枚举。
代码,时间复杂度O(n^3),空间复杂度,排序算法使用快速排序,需要O(logN)的栈空间复杂度。 |
---|
class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> quadruplets = new ArrayList<List<Integer>>();if(nums == null || nums.length < 4) return quadruplets;Arrays.sort(nums);int length = nums.length;for(int i = 0; i < length - 3; i++){int x = nums[i];if(i > 0 && x == nums[i-1]) continue;if((long)x + nums[i+1] + nums[i+2] + nums[i+3] > target) break;if((long)x + nums[length-1] + nums[length-2] + nums[length-3] < target) continue;for(int j = i+1; j<length-2; j++){int y = nums[j];if(j > i+1 && y == nums[j-1]) continue;if((long)x + y + nums[j+1] + nums[j+2] > target) break;if((long)x + y + nums[length-1] + nums[length-2] < target) continue;int left = j + 1, right = length - 1;while(left < right){int z = nums[left], t = nums[right];long sum = (long)x + y + z + t;if(sum > target) --right;else if(sum < target) ++ left;else{quadruplets.add(Arrays.asList(x,y,z,t));for(++left;left<right && nums[left] == nums[left-1]; ++left);for(--right; right>left && nums[right] == nums[right+1]; --right);}}}}return quadruplets;}
}