42
42
<li><code>-10<sup>5</sup> <= nums[i] <= 10<sup>5</sup></code></li>
43
43
</ul >
44
44
45
-
46
45
## 解法
47
46
48
47
<!-- 这里可写通用的实现逻辑 -->
58
57
``` python
59
58
class Solution :
60
59
def threeSum (self , nums : List[int ]) -> List[List[int ]]:
61
- if nums is None or len (nums) < 3 :
62
- return []
60
+ n, res = len (nums), []
61
+ if n < 3 :
62
+ return res
63
63
nums.sort()
64
- n = len (nums)
65
- res = []
66
64
for i in range (n - 2 ):
65
+ if nums[i] > 0 :
66
+ break
67
67
if i > 0 and nums[i] == nums[i - 1 ]:
68
68
continue
69
- p, q = i + 1 , n - 1
70
- while p < q :
71
- if p > i + 1 and nums[p ] == nums[p - 1 ] :
72
- p += 1
73
- continue
74
- if q < n - 1 and nums[q] == nums[q + 1 ]:
75
- q -= 1
76
- continue
77
- if nums[i] + nums[p] + nums[q] < 0 :
78
- p + = 1
79
- elif nums[i] + nums[p ] + nums[q] > 0 :
80
- q - = 1
69
+ j, k = i + 1 , n - 1
70
+ while j < k :
71
+ if nums[i] + nums[j] + nums[k ] == 0 :
72
+ res.append([nums[i], nums[j], nums[k]])
73
+ j += 1
74
+ k -= 1
75
+ while j < n and nums[j] == nums[j - 1 ]:
76
+ j += 1
77
+ while k > i and nums[k] == nums[k + 1 ] :
78
+ k - = 1
79
+ elif nums[i] + nums[j ] + nums[k] < 0 :
80
+ j + = 1
81
81
else :
82
- res.append([nums[i], nums[p], nums[q]])
83
- p += 1
84
- q -= 1
82
+ k -= 1
85
83
return res
86
84
```
87
85
@@ -92,34 +90,32 @@ class Solution:
92
90
``` java
93
91
class Solution {
94
92
public List<List<Integer > > threeSum (int [] nums ) {
95
- int n;
96
- if (nums == null || (n = nums . length) < 3 ) {
93
+ int n = nums . length ;
94
+ if (n < 3 ) {
97
95
return Collections . emptyList();
98
96
}
99
97
Arrays . sort(nums);
100
98
List<List<Integer > > res = new ArrayList<> ();
101
- for (int i = 0 ; i < n - 2 ; ++ i) {
99
+ for (int i = 0 ; i < n - 2 && nums[i] <= 0 ; ++ i) {
102
100
if (i > 0 && nums[i] == nums[i - 1 ]) {
103
101
continue ;
104
102
}
105
- int p = i + 1 , q = n - 1 ;
106
- while (p < q ) {
107
- if (p > i + 1 && nums[p ] == nums[p - 1 ] ) {
108
- ++ p ;
109
- continue ;
110
- }
111
- if (q < n - 1 && nums[q ] == nums[q + 1 ]) {
112
- -- q ;
113
- continue ;
114
- }
115
- if (nums[p] + nums[q] + nums[i] < 0 ) {
116
- ++ p;
117
- } else if (nums[p ] + nums[q ] + nums[i] > 0 ) {
118
- -- q ;
103
+ int j = i + 1 , k = n - 1 ;
104
+ while (j < k ) {
105
+ if (nums[i] + nums[j] + nums[k ] == 0 ) {
106
+ res . add( Arrays . asList(nums[i], nums[j], nums[k])) ;
107
+ ++ j ;
108
+ -- k;
109
+ while (j < n && nums[j ] == nums[j - 1 ]) {
110
+ ++ j ;
111
+ }
112
+ while (k > i && nums[k] == nums[k + 1 ]) {
113
+ -- k;
114
+ }
115
+ } else if (nums[i ] + nums[j ] + nums[k] < 0 ) {
116
+ ++ j ;
119
117
} else {
120
- res. add(Arrays . asList(nums[p], nums[q], nums[i]));
121
- ++ p;
122
- -- q;
118
+ -- k;
123
119
}
124
120
}
125
121
}
@@ -128,36 +124,67 @@ class Solution {
128
124
}
129
125
```
130
126
127
+ ### ** C++**
128
+
129
+ ``` cpp
130
+ class Solution {
131
+ public:
132
+ vector<vector<int >> threeSum(vector<int >& nums) {
133
+ int n = nums.size();
134
+ if (n < 3) {
135
+ return {};
136
+ }
137
+ sort(nums.begin(), nums.end());
138
+ vector<vector<int >> res;
139
+ for (int i = 0; i < n - 2 && nums[ i] <= 0; ++i) {
140
+ if (i > 0 && nums[ i] == nums[ i - 1] ) continue;
141
+ int j = i + 1, k = n - 1;
142
+ while (j < k) {
143
+ if (nums[ i] + nums[ j] + nums[ k] == 0) {
144
+ res.push_back({nums[ i] , nums[ j] , nums[ k] });
145
+ ++j;
146
+ --k;
147
+ while (j < n && nums[ j] == nums[ j - 1] ) ++j;
148
+ while (k > i && nums[ k] == nums[ k + 1] ) --k;
149
+ } else if (nums[ i] + nums[ j] + nums[ k] < 0) {
150
+ ++j;
151
+ } else {
152
+ --k;
153
+ }
154
+ }
155
+ }
156
+ return res;
157
+ }
158
+ };
159
+ ```
160
+
131
161
### **JavaScript**
132
162
133
163
```js
134
164
/**
135
165
* @param {number[]} nums
136
166
* @return {number[][]}
137
167
*/
138
- var threeSum = function (nums ) {
139
- let len = nums .length ;
140
- if (len < 3 ) return [];
168
+ var threeSum = function(nums) {
169
+ const n = nums.length;
170
+ if (n < 3) return [];
141
171
let res = [];
142
172
nums.sort((a, b) => a - b);
143
- for (let i = 0 ; i < len - 2 ; i++ ) {
144
- if (nums[i] > 0 ) break ;
145
- if (i > 0 && nums[i] === nums[i - 1 ]) continue ;
146
- let left = i + 1 , right = len - 1 ;
147
- while (left < right) {
148
- if (nums[i] + nums[left] + nums[right] === 0 ) {
149
- res .push ([nums[i], nums[left], nums[right]]);
150
- while (nums[left] === nums[left + 1 ]) left++ ;
151
- left++ ;
152
- while (nums[right] === nums[right - 1 ]) right-- ;
153
- right-- ;
154
- continue ;
155
- } else if (nums[i] + nums[left] + nums[right] > 0 ) {
156
- right-- ;
157
- continue ;
173
+ for (let i = 0; i < n - 2 && nums[i] <= 0; ++i) {
174
+ if (i > 0 && nums[i] == nums[i - 1]) continue;
175
+ let j = i + 1;
176
+ let k = n - 1;
177
+ while (j < k) {
178
+ if (nums[i] + nums[j] + nums[k] === 0) {
179
+ res.push([nums[i], nums[j], nums[k]]);
180
+ ++j;
181
+ --k;
182
+ while (nums[j] === nums[j - 1]) ++j;
183
+ while (nums[k] === nums[k + 1]) --k;
184
+ } else if (nums[i] + nums[j] + nums[k] < 0) {
185
+ ++j;
158
186
} else {
159
- left++ ;
160
- continue ;
187
+ --k;
161
188
}
162
189
}
163
190
}
0 commit comments