问题描述
问题分析
分析题目,和前几个题目的思路一脉相承。我就简述一下思路:
将数组排好序,用双层循环分别先确定第一个数和第二个数,在剩余元素集合的首尾指针i、j的对撞过程中,计算四数之和:
若结果等于target,则表示找到一个解;
若结果大于target。则表示j指针所指元素偏大,需右移,j–;
若结果小于target。则表示i指针所指元素偏小,需左移,i++;
解法:对撞指针
- 时间复杂度:O( n3 ),其中n表示数组的长度。
Java代码
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> results = new ArrayList<>();
Arrays.sort(nums);
for (int first = 0; (nums.length >= 4) && (first < nums.length-3); first++) {
//与前一个first所对的数字不重复
if (!(first > 0 && nums[first] == nums[first-1])){
for (int second = first + 1; second < nums.length - 2; second++) {
//与前一个second所对的数字不重复
if (!(second - first > 1 && nums[second] == nums[second-1])){
int i = second + 1;
int j = nums.length - 1;
while (i < j){
if (nums[i] + nums[j] + nums[first] + nums[second] == target){
List<Integer> result = new ArrayList<>();
result.add(nums[first]);
result.add(nums[second]);
result.add(nums[i]);
result.add(nums[j]);
results.add(result);
//去重(与前一个i或者j所对的数字不重复)
do {
i++;
}while (i > 0 && i < j && nums[i] == nums[i-1]);
do {
j--;
}while (j < nums.length-1 && i < j && nums[j] == nums[j+1]);
} else if (nums[i] + nums[j] + nums[first] + nums[second] > target){
do {
j--;
}while (j < nums.length-1 && i < j && nums[j] == nums[j+1]);
} else {
do {
i++;
}while (i > 0 && i < j && nums[i] == nums[i-1]);
}
}
}
}
}
}
return results;
}
}
结果分析
以上代码的执行结果:
执行时间 | 内存消耗 |
---|---|
122 ms | 39.8MB |