LeetCode 18. 4Sum
LeetCode 18. 4Sum (四数之和)
题目
链接
https://leetcode-cn.com/problems/4sum/
问题描述
给你一个由 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
你可以按 任意顺序 返回答案 。
示例
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
提示
1 <= nums.length <= 200
-109 <= nums[i] <= 109
-109 <= target <= 109
思路
和三数之和一个思路,前两个采用循环,第三四个采用双指针。
复杂度分析
时间复杂度 O(n3)
空间复杂度 O(n)
代码
Java
public List<List<Integer>> fourSum(int[] nums, int target) {
HashSet<List<Integer>> all = new HashSet<>();
ArrayList<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
int n = nums.length;
if (n < 4) {
return ans;
}
for (int i = 0; i < n - 3; i++) {
for (int j = i + 1; j < n - 2; j++) {
int sum = nums[i] + nums[j];
int left = j + 1;
int right = n - 1;
while (left < right) {
int tmpsum = sum + nums[left] + nums[right];
if (tmpsum == target) {
List<Integer> tmp = new ArrayList<>();
tmp.add(nums[i]);
tmp.add(nums[j]);
tmp.add(nums[left++]);
tmp.add(nums[right--]);
tmp.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
all.add(tmp);
} else if (tmpsum < target) {
left++;
} else {
right--;
}
}
}
}
Iterator<List<Integer>> iterator = all.iterator();
while (iterator.hasNext()) {
ans.add(iterator.next());
}
return ans;
}
分类:
LeetCode(Java)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)