Leetcode 18.四数之和
题目要求
-
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
-
0 <= a, b, c, d < n
-
a、b、c 和 d 互不相同
-
nums[a] + nums[b] + nums[c] + nums[d] == target
-
你可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
提交
排序+双指针
与三数之和的解决思路类似
在最外层再套一层循环作为第一个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> res = new ArrayList<>(); Arrays.sort(nums); for(int k = 0; k < nums.length; k++){ if(nums[k] > target && target >= 0) break; if(k > 0 && nums[k] == nums[k - 1]) continue; for(int i = k + 1; i < nums.length; i++){ if(nums[i] + nums[k] > target && nums[i] + nums[k] >= 0) break; if(i > k + 1&& nums[i] == nums[i - 1]) continue; int left = i + 1; int right = nums.length - 1; while(left < right){ long sum = (long)nums[k] + nums[i] + nums[left] + nums[right]; if(sum > target){ right--; }else if(sum < target){ left++; }else{ res.add(Arrays.asList(nums[k], nums[i], nums[left], nums[right])); while(left < right && nums[left] == nums[left + 1]) left++; while(left < right && nums[right] == nums[right - 1]) right--; left++; right--; } } } } return res; } }
|