53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
56
- ** 计数: **
56
+ ** 方法一:三指针 **
57
57
58
- - 遍历 ` nums ` ,记录其中 ` 0 ` 、` 1 ` 和 ` 2 ` 出现的次数。
59
- - 依照记录的数字,按照顺序重新填充 ` nums ` 。
58
+ 我们定义三个指针 $i$, $j$ 和 $k$,其中指针 $i$ 用于指向数组中元素值为 $0$ 的最右边界,指针 $j$ 用于指向数组中元素值为 $2$ 的最左边界,初始时 $i=-1$, $j=n$。指针 $k$ 用于指向当前遍历的元素,初始时 $k=0$。
60
59
61
- ** 双指针: **
60
+ 当 $k \lt j$ 时,我们执行如下操作:
62
61
63
- 数组元素只存在 ` 0 ` 、` 1 ` 和 ` 2 ` 三种,因此将 ` 0 ` 移动至数组头部,` 2 ` 移动至数组尾部,排序便完成了。
62
+ - 若 $nums[ k] =0$,则将其与 $nums[ i+1] $ 交换,然后 $i$ 和 $k$ 都加 $1$;
63
+ - 若 $nums[ k] =2$,则将其与 $nums[ j-1] $ 交换,然后 $j$ 减 $1$;
64
+ - 若 $nums[ k] =1$,则 $k$ 加 $1$。
64
65
65
- - 安排两个变量,分别指向数组头部与尾部。
66
- - 遍历数组,分三种情况:
67
- - ` 0 ` :与头指针数值交换,并向前一步,遍历指针向前。
68
- - ` 2 ` :与尾指针数值交换,并向后一步。** 遍历指针不变** (还需要处理交换上来的数值)。
69
- - ` 1 ` :遍历指针向前。
66
+ 遍历结束后,数组中的元素就被分成了 $[ 0,i] $, $[ i+1,j-1] $ 和 $[ j,n-1] $ 三个部分。
67
+
68
+ 时间复杂度 $O(n)$,其中 $n$ 是数组的长度。只需要遍历一遍数组即可。空间复杂度 $O(1)$。
70
69
71
70
<!-- tabs:start -->
72
71
77
76
``` python
78
77
class Solution :
79
78
def sortColors (self , nums : List[int ]) -> None :
80
- """
81
- Do not return anything, modify nums in-place instead.
82
- """
83
- i, j = - 1 , len (nums)
84
- cur = 0
85
- while cur < j:
86
- if nums[cur] == 0 :
79
+ i, j, k = - 1 , len (nums), 0
80
+ while k < j:
81
+ if nums[k] == 0 :
87
82
i += 1
88
- nums[cur], nums[i] = nums[i], nums[cur]
89
- cur += 1
90
- elif nums[cur] == 1 :
91
- cur += 1
92
- else :
83
+ nums[i], nums[k] = nums[k], nums[i]
84
+ k += 1
85
+ elif nums[k] == 2 :
93
86
j -= 1
94
- nums[cur], nums[j] = nums[j], nums[cur]
87
+ nums[j], nums[k] = nums[k], nums[j]
88
+ else :
89
+ k += 1
95
90
```
96
91
97
92
### ** Java**
@@ -101,92 +96,40 @@ class Solution:
101
96
``` java
102
97
class Solution {
103
98
public void sortColors (int [] nums ) {
104
- int i = - 1 , j = nums. length;
105
- int cur = 0 ;
106
- while (cur < j) {
107
- if (nums[cur] == 0 ) {
108
- swap(nums, cur++ , ++ i);
109
- } else if (nums[cur] == 1 ) {
110
- ++ cur;
99
+ int i = - 1 , j = nums. length, k = 0 ;
100
+ while (k < j) {
101
+ if (nums[k] == 0 ) {
102
+ swap(nums, ++ i, k++ );
103
+ } else if (nums[k] == 2 ) {
104
+ swap(nums, -- j, k);
111
105
} else {
112
- swap(nums, cur, -- j) ;
106
+ ++ k ;
113
107
}
114
108
}
115
109
}
116
110
117
111
private void swap (int [] nums , int i , int j ) {
118
112
int t = nums[i];
119
- nums[i] = nums[j];
113
+ nums[i] = nums[j];
120
114
nums[j] = t;
121
115
}
122
116
}
123
117
```
124
118
125
- ### ** TypeScript**
126
-
127
- ``` ts
128
- /**
129
- Do not return anything, modify nums in-place instead.
130
- */
131
- function sortColors(nums : number []): void {
132
- let n = nums .length ;
133
- if (n < 2 ) return ;
134
- let p0 = 0 ,
135
- p2 = n - 1 ;
136
- let p1 = 0 ;
137
- while (p1 <= p2 ) {
138
- if (nums [p1 ] == 0 ) {
139
- [nums [p0 ], nums [p1 ]] = [nums [p1 ], nums [p0 ]];
140
- p0 ++ ;
141
- p1 ++ ;
142
- } else if (nums [p1 ] == 1 ) {
143
- p1 ++ ;
144
- } else {
145
- [nums [p1 ], nums [p2 ]] = [nums [p2 ], nums [p1 ]];
146
- p2 -- ;
147
- }
148
- }
149
- }
150
- ```
151
-
152
- ``` ts
153
- /**
154
- Do not return anything, modify nums in-place instead.
155
- */
156
- function sortColors(nums : number []): void {
157
- const n = nums .length ;
158
- let l = - 1 ;
159
- let r = n ;
160
- let i = 0 ;
161
- while (i < r ) {
162
- if (nums [i ] === 2 ) {
163
- r -- ;
164
- [nums [r ], nums [i ]] = [nums [i ], nums [r ]];
165
- } else {
166
- if (nums [i ] === 0 ) {
167
- l ++ ;
168
- [nums [l ], nums [i ]] = [nums [i ], nums [l ]];
169
- }
170
- i ++ ;
171
- }
172
- }
173
- }
174
- ```
175
-
176
119
### ** C++**
177
120
178
121
``` cpp
179
122
class Solution {
180
123
public:
181
124
void sortColors(vector<int >& nums) {
182
- int i = -1, j = nums.size(), cur = 0;
183
- while (cur < j) {
184
- if (nums[ cur ] == 0) {
185
- swap(nums[ ++i] , nums[ cur ++] );
186
- } else if (nums[ cur ] == 1 ) {
187
- ++cur ;
125
+ int i = -1, j = nums.size(), k = 0;
126
+ while (k < j) {
127
+ if (nums[ k ] == 0) {
128
+ swap(nums[ ++i] , nums[ k ++] );
129
+ } else if (nums[ k ] == 2 ) {
130
+ swap(nums [ --j ] , nums [ k ] ) ;
188
131
} else {
189
- swap(nums [ cur ] , nums [ --j ] ) ;
132
+ ++k ;
190
133
}
191
134
}
192
135
}
@@ -197,71 +140,92 @@ public:
197
140
198
141
```go
199
142
func sortColors(nums []int) {
200
- i, j, cur := -1, len(nums), 0
201
- for cur < j {
202
- if nums[cur ] == 0 {
143
+ i, j, k := -1, len(nums), 0
144
+ for k < j {
145
+ if nums[k ] == 0 {
203
146
i++
204
- nums[cur], nums[i] = nums[i], nums[cur]
205
- cur++
206
- } else if nums[cur] == 1 {
207
- cur++
208
- } else {
147
+ nums[i], nums[k] = nums[k], nums[i]
148
+ k++
149
+ } else if nums[k] == 2 {
209
150
j--
210
- nums[cur], nums[j] = nums[j], nums[cur]
151
+ nums[j], nums[k] = nums[k], nums[j]
152
+ } else {
153
+ k++
211
154
}
212
155
}
213
156
}
214
157
```
215
158
159
+ ### ** TypeScript**
160
+
161
+ ``` ts
162
+ /**
163
+ Do not return anything, modify nums in-place instead.
164
+ */
165
+ function sortColors(nums : number []): void {
166
+ let i = - 1 ;
167
+ let j = nums .length ;
168
+ let k = 0 ;
169
+ while (k < j ) {
170
+ if (nums [k ] === 0 ) {
171
+ ++ i ;
172
+ [nums [i ], nums [k ]] = [nums [k ], nums [i ]];
173
+ ++ k ;
174
+ } else if (nums [k ] === 2 ) {
175
+ -- j ;
176
+ [nums [j ], nums [k ]] = [nums [k ], nums [j ]];
177
+ } else {
178
+ ++ k ;
179
+ }
180
+ }
181
+ }
182
+ ```
183
+
216
184
### ** Rust**
217
185
218
186
``` rust
219
187
impl Solution {
220
188
pub fn sort_colors (nums : & mut Vec <i32 >) {
221
- let mut l = 0 ;
222
- let mut r = nums . len () - 1 ;
223
- let mut i = 0 ;
224
- while i <= r {
225
- match nums [i ] {
226
- 2 => {
227
- nums . swap (i , r );
228
- match r {
229
- 0 => return ,
230
- _ => r -= 1 ,
231
- }
232
- }
233
- n => {
234
- if n == 0 {
235
- nums . swap (i , l );
236
- l += 1 ;
237
- }
238
- i += 1 ;
239
- }
189
+ let mut i = - 1 ;
190
+ let mut j = nums . len ();
191
+ let mut k = 0 ;
192
+ while k < j {
193
+ if nums [k ] == 0 {
194
+ i += 1 ;
195
+ nums . swap (i as usize , k as usize );
196
+ k += 1 ;
197
+ } else if nums [k ] == 2 {
198
+ j -= 1 ;
199
+ nums . swap (j , k );
200
+ } else {
201
+ k += 1 ;
240
202
}
241
203
}
242
204
}
243
205
}
244
206
```
245
207
246
- ``` rust
247
- impl Solution {
248
- pub fn sort_colors (nums : & mut Vec <i32 >) {
249
- let mut count = [0 , 0 , 0 ];
250
- for num in nums . iter () {
251
- count [* num as usize ] += 1 ;
208
+ ### ** C#**
209
+
210
+ ``` cs
211
+ public class Solution {
212
+ public void SortColors (int [] nums ) {
213
+ int i = - 1 , j = nums .Length , k = 0 ;
214
+ while (k < j ) {
215
+ if (nums [k ] == 0 ) {
216
+ swap (nums , ++ i , k ++ );
217
+ } else if (nums [k ] == 2 ) {
218
+ swap (nums , -- j , k );
219
+ } else {
220
+ ++ k ;
221
+ }
252
222
}
253
- count [1 ] += count [0 ];
254
- count [2 ] += count [1 ];
223
+ }
255
224
256
- for i in 0 .. count [0 ] {
257
- nums [i ] = 0 ;
258
- }
259
- for i in count [0 ].. count [1 ] {
260
- nums [i ] = 1 ;
261
- }
262
- for i in count [1 ].. count [2 ] {
263
- nums [i ] = 2 ;
264
- }
225
+ private void swap (int [] nums , int i , int j ) {
226
+ int t = nums [i ];
227
+ nums [i ] = nums [j ];
228
+ nums [j ] = t ;
265
229
}
266
230
}
267
231
```
0 commit comments