leetcode-4sum

题目大意

  https://leetcode.com/problems/4sum/

  4个数之和等于target,让你找出所有组合,注意输出的组合中不能有重复的

题目分析

  此题跟3sum的解法类似,还是先对原数组排序,然后先枚举两个数,剩下的两个数采用双指针不断移动的思路,因此时间复杂度是O(n^3),需要注意不要把重复的加进结果中,具体可以看代码中注释部分。

代码

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
44
45
46
47
48
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if (nums == null || nums.length < 4) {
return ans;
}
Arrays.sort(nums);
int len = nums.length;
for (int i = 0 ; i < len - 3; i++) {
if (i > 0 && nums[i] == nums[i - 1]) { //重复i不加
continue;
}
for (int j = i + 1; j < len - 2; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) { //重复j不加
continue;
}
int p1 = j + 1;
int p2 = len - 1;
while (p1 < p2) {
int v = nums[p1] + nums[p2] + nums[i] + nums[j];
if (v == target) {
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(nums[i]);
tmp.add(nums[j]);
tmp.add(nums[p1]);
tmp.add(nums[p2]);
ans.add(tmp);
p1++;
p2--;
// 以下代码段是两个指针不断移动的过程,是为了避免跟上次指针指向的值相同
while (p1 < p2 && nums[p1] == nums[p1 - 1]) {
p1++;
}
while (p1 < p2 && nums[p2] == nums[p2 + 1]) {
p2--;
}
} else if (v > target) {
p2--;
} else {
p1++;
}
}
}
}
return ans;
}
}

  算法复杂度:O(n^3)