Skip to content

Commit 7cef6ba

Browse files
committed
feat: add solutions to lc problem: No.0075
No.0075.Sort Colors
1 parent 7d12a0d commit 7cef6ba

File tree

9 files changed

+295
-359
lines changed

9 files changed

+295
-359
lines changed

solution/0000-0099/0075.Sort Colors/README.md

Lines changed: 99 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,19 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56-
**计数:**
56+
**方法一:三指针**
5757

58-
- 遍历 `nums`,记录其中 `0``1``2` 出现的次数。
59-
- 依照记录的数字,按照顺序重新填充 `nums`
58+
我们定义三个指针 $i$, $j$ 和 $k$,其中指针 $i$ 用于指向数组中元素值为 $0$ 的最右边界,指针 $j$ 用于指向数组中元素值为 $2$ 的最左边界,初始时 $i=-1$, $j=n$。指针 $k$ 用于指向当前遍历的元素,初始时 $k=0$。
6059

61-
**双指针:**
60+
当 $k \lt j$ 时,我们执行如下操作:
6261

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$。
6465

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)$。
7069

7170
<!-- tabs:start -->
7271

@@ -77,21 +76,17 @@
7776
```python
7877
class Solution:
7978
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:
8782
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:
9386
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
9590
```
9691

9792
### **Java**
@@ -101,92 +96,40 @@ class Solution:
10196
```java
10297
class Solution {
10398
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);
111105
} else {
112-
swap(nums, cur, --j);
106+
++k;
113107
}
114108
}
115109
}
116110

117111
private void swap(int[] nums, int i, int j) {
118112
int t = nums[i];
119-
nums[i] = nums[j];
113+
nums[i] = nums[j];
120114
nums[j] = t;
121115
}
122116
}
123117
```
124118

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-
176119
### **C++**
177120

178121
```cpp
179122
class Solution {
180123
public:
181124
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]);
188131
} else {
189-
swap(nums[cur], nums[--j]);
132+
++k;
190133
}
191134
}
192135
}
@@ -197,71 +140,92 @@ public:
197140
198141
```go
199142
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 {
203146
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 {
209150
j--
210-
nums[cur], nums[j] = nums[j], nums[cur]
151+
nums[j], nums[k] = nums[k], nums[j]
152+
} else {
153+
k++
211154
}
212155
}
213156
}
214157
```
215158

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+
216184
### **Rust**
217185

218186
```rust
219187
impl Solution {
220188
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;
240202
}
241203
}
242204
}
243205
}
244206
```
245207

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+
}
252222
}
253-
count[1] += count[0];
254-
count[2] += count[1];
223+
}
255224

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;
265229
}
266230
}
267231
```

0 commit comments

Comments
 (0)