目录
注意:正常提交后有问题。
1. 思路
2. 解题方法
2.1 排序数组
2.2 双指针遍历
3. 复杂度
4. Code
题目:
给你一个由
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
注意:正常提交后有问题。
根据错误提示修改
对于特定的测试用例 [1000000000,1000000000,1000000000,1000000000]
和 target = -294967296
,我们需要对代码进行一些优化以避免整数溢出问题。
1. 思路
这道题目可以使用双指针和排序的方法来解决。首先对数组进行排序,然后使用两层循环固定两个数,再使用双指针在剩余的数中寻找另外两个数,使得它们的和等于目标值。
对于提交问题,我们可以使用类似三数之和和四数之和的解法,但是需要特别注意整数溢出问题。
2. 解题方法
2.1 排序数组
首先对数组进行排序。
2.2 双指针遍历
使用两层循环固定两个数 nums[i]
和 nums[j]
,然后使用双指针 left
和 right
分别指向 j+1
和 n-1
。在剩余的数中寻找另外两个数,使得它们的和等于 target - nums[i] - nums[j]
。
- 如果
nums[i] + nums[j] + nums[left] + nums[right] == target
,则将这四个数加入结果集,并移动双指针去除重复元素。 - 如果
nums[i] + nums[j] + nums[left] + nums[right] < target
,则移动左指针,使得和增大。 - 如果
nums[i] + nums[j] + nums[left] + nums[right] > target
,则移动右指针,使得和减小。
3. 复杂度
- 时间复杂度:排序的时间复杂度为 O(nlogn),双指针遍历的时间复杂度为 O(n^3),总体时间复杂度为 O(n^3)。
- 空间复杂度:O(logn),主要用于排序。
4. Code
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(nums);int n = nums.length;for (int i = 0; i < n - 3; i++) {// 去除重复解if (i > 0 && nums[i] == nums[i - 1]) continue;for (int j = i + 1; j < n - 2; j++) {// 去除重复解if (j > i + 1 && nums[j] == nums[j - 1]) continue;int left = j + 1, right = n - 1;while (left < right) {long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];if (sum == target) {result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));// 去除重复解while (left < right && nums[left] == nums[left + 1]) left++;while (left < right && nums[right] == nums[right - 1]) right--;left++;right--;} else if (sum < target) {left++;} else {right--;}}}}return result;}
}
这段代码实现了寻找数组中满足条件的四个数的和等于目标值的情况,并返回所有满足条件的四元组。且对长整型(long
)进行了适当的转换,以避免整数溢出问题。
欢迎大家留言讨论。
(一份Java面试宝典,有兴趣的读者可以私信我领取!!!免费滴)