1
1
class Solution {
2
2
public List <List <Integer >> fourSum (int [] nums , int target ) {
3
-
4
- List <List <Integer >> re = new ArrayList <>();
5
- if (nums == null || nums .length < 4 ) {
6
- return re ;
3
+ int n ;
4
+ if (nums == null || (n = (nums .length )) < 4 ) {
5
+ return Collections .emptyList ();
7
6
}
8
7
Arrays .sort (nums );
9
- for (int i = 0 ; i < nums .length - 3 ; i ++) {
10
-
11
- // 当 nums[i] 对应的最小组合都大于 target 时,后面大于 nums[i] 的组合必然也大于 target,
12
- if (nums [i ] + nums [i + 1 ] + nums [i + 2 ] + nums [i + 3 ] > target ) {
13
- break ;
14
- }
15
- // 当 nums[i] 对应的最大组合都小于 target 时, nums[i] 的其他组合必然也小于 target
16
- if (nums [i ] + nums [nums .length - 3 ] + nums [nums .length - 2 ] + nums [nums .length - 1 ] < target ) {
8
+ List <List <Integer >> res = new ArrayList <>();
9
+ for (int i = 0 ; i < n - 3 ; ++i ) {
10
+ if (i > 0 && nums [i ] == nums [i - 1 ]) {
17
11
continue ;
18
12
}
19
-
20
- int firstNum = nums [i ];
21
- for (int j = i + 1 ; j < nums .length - 2 ; j ++) {
22
-
23
- // nums[j] 过大时,与 nums[i] 过大同理
24
- if (nums [i ] + nums [j ] + nums [j + 1 ] + nums [j + 2 ] > target ) {
25
- break ;
26
- }
27
- // nums[j] 过小时,与 nums[i] 过小同理
28
- if (nums [i ] + nums [j ] + nums [nums .length - 2 ] + nums [nums .length - 1 ] < target ) {
13
+ for (int j = i + 1 ; j < n - 2 ; ++j ) {
14
+ if (j > i + 1 && nums [j ] == nums [j - 1 ]) {
29
15
continue ;
30
16
}
31
-
32
- int twoSum = target - nums [i ] - nums [j ];
33
- int l = j + 1 ;
34
- int k = nums .length - 1 ;
35
- while (l < k ) {
36
- int tempSum = nums [l ] + nums [k ];
37
- if (tempSum == twoSum ) {
38
- ArrayList <Integer > oneGroup = new ArrayList <>(4 );
39
- oneGroup .add (nums [i ]);
40
- oneGroup .add (nums [j ]);
41
- oneGroup .add (nums [l ++]);
42
- oneGroup .add (nums [k --]);
43
- re .add (oneGroup );
44
- while (l < nums .length && l < k && nums [l ] == oneGroup .get (2 ) && nums [k ] == oneGroup .get (3 )) {
45
- l ++;
46
- k --;
47
- }
48
- } else if (tempSum < twoSum ) {
49
- l ++;
50
- } else {
51
- k --;
52
- }
53
- }
54
- // 跳过重复项
55
- while ((j < nums .length - 2 ) && (twoSum + nums [i ] + nums [j + 1 ] == target )) {
56
- j ++;
57
- }
58
- }
59
- // 跳过重复项
60
- while (i < nums .length - 3 && nums [i + 1 ] == firstNum ) {
61
- i ++;
62
- }
63
- }
64
- return re ;
65
- }
66
- }
67
-
68
- /*
69
-
70
- class Solution {
71
- public List<List<Integer>> fourSum(int[] nums, int target) {
72
- Arrays.sort(nums);
73
- int n = nums.length;
74
- List<List<Integer>> list = new ArrayList<>();
75
- int p = 0;
76
- int q = 0;
77
- for (int i = 0; i < n - 3; ++i) {
78
- for (int j = i + 1; j < n - 2; ++j) {
79
- p = j + 1;
80
- q = n - 1;
17
+ int p = j + 1 , q = n - 1 ;
81
18
while (p < q ) {
82
- int val = nums[i] + nums[j] + nums[p] + nums[q];
83
- if (val == target) {
84
- list.add(Arrays.asList(nums[i], nums[j], nums[p], nums[q]));
85
- // p 指针右移,直到 nums[p] 与 nums[p - 1] 不等
19
+ if (p > j + 1 && nums [p ] == nums [p - 1 ]) {
86
20
++p ;
87
- while (p < q && nums[p] == nums[p - 1]) {
88
- ++p;
89
- }
21
+ continue ;
22
+ }
23
+ if ( q < n - 1 && nums [ q ] == nums [ q + 1 ]) {
90
24
--q ;
91
- while (p < q && nums[q] == nums[q + 1]) {
92
- --q;
93
- }
94
- } else if (val > target) {
25
+ continue ;
26
+ }
27
+ int t = nums [i ] + nums [j ] + nums [p ] + nums [q ];
28
+ if (t == target ) {
29
+ res .add (Arrays .asList (nums [i ], nums [j ], nums [p ], nums [q ]));
30
+ ++p ;
95
31
--q ;
32
+ } else if (t < target ) {
33
+ ++p ;
96
34
} else {
97
- q = val > target ? q - 1 : q;
98
- p = val < target ? p + 1 : p;
35
+ --q ;
99
36
}
100
37
}
101
-
102
- // j < n - 3:保证 j 不会溢出
103
- while (j < n - 3 && nums[j] == nums[j + 1]) {
104
- ++j;
105
- }
106
- }
107
-
108
- // i < n - 4:保证 i 不会溢出
109
- while (i < n - 4 && nums[i] == nums[i + 1]) {
110
- ++i;
111
38
}
112
39
}
113
- return list ;
40
+ return res ;
114
41
}
115
- }
116
-
117
- */
42
+ }
0 commit comments