一、题目描述
来源:力扣(LeetCode)
给你一个由 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 <= nums.length <= 200
- -109 <= nums[i] <= 109
- -109 <= target <= 109
二丶思路分析
排序 + 双指针
这个题目 和 【刷题记录】15.三数之和 的思路是一样的,只不过是从三个数,变成了四个数字的处理。
- 定义 四个 指针
i
,j
,L
,R
- 在确定两个数
i
,j
的情况下,双指针L
,R
从两边遍历,查找。
三、代码实现
class Solution { public List<List<Integer>> fourSum(int[] nums, int t) { Arrays.sort(nums); int n = nums.length; List<List<Integer>> res = new ArrayList<>(); // 确定第一个数 for (int i =0; i < n; i++) { // 对第一个数进行去重 if (i > 0 && nums[i] == nums[i -1]) continue; // 确定第二个数 for (int j = i +1; j < n; j++) { // 对第二个数进行去重 if (j > i +1 && nums[j] == nums[j -1]) continue; // 确定第三个数和第四个数 int L = j +1; int R = n -1; while (L < R) { // 对第三个数进行去重 while (L > j +1 && L < n && nums[L] == nums[L -1]) L++; if (L >= R) break; int sum = nums[i] + nums[j] + nums[L] + nums[R]; if (sum == t) { res.add(Arrays.asList(nums[i], nums[j], nums[L], nums[R])); L++; } elseif (sum > t) { R--; } else { L++; } } } } return res; } }
复杂度分析
时间复杂度:
网络异常,图片无法展示
|
n
是数组的长度。排序的时间复杂度是
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
空间复杂度:
网络异常,图片无法展示
|
运行结果
网络异常,图片无法展示
|
总结
这个题目是个以前做过题目的一个变形,从三元变成了四元,但是处理的思路是一样。只是处理的步骤会多一下。
所以这种题目,只要理解一个,一类的问题都能迎刃而解。继续加油~