Skip to content

Commit 4c47062

Browse files
committed
add LeetCode 75. 颜色分类
1 parent a54a770 commit 4c47062

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed

Diff for: 双指针/LeetCode 75. 颜色分类.md

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2Nob2NvbGF0ZTE5OTkvY2RuL2ltZy8yMDIwMDgyODE0NTUyMS5qcGc?x-oss-process=image/format,png)
2+
>仰望星空的人,不应该被嘲笑
3+
4+
## 题目描述
5+
6+
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
7+
8+
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
9+
10+
注意:
11+
不能使用代码库中的排序函数来解决这道题。
12+
13+
示例:
14+
15+
```javascript
16+
输入: [2,0,2,1,1,0]
17+
输出: [0,0,1,1,2,2]
18+
```
19+
20+
进阶:
21+
22+
一个直观的解决方案是使用计数排序的两趟扫描算法。
23+
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
24+
你能想出一个仅使用常数空间的一趟扫描算法吗?
25+
26+
来源:力扣(LeetCode)
27+
链接:https://leetcode-cn.com/problems/sort-colors
28+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
29+
30+
31+
32+
## 解题思路
33+
34+
双指针,当前值为2,那么就和右边指针进行交换,反之当前值为0,那么就和左边指针进行交换,为1就不动。
35+
36+
```javascript
37+
/**
38+
* @param {number[]} nums
39+
* @return {void} Do not return anything, modify nums in-place instead.
40+
*/
41+
var sortColors = function (nums) {
42+
let len = nums.length;
43+
let L = 0;
44+
let R = len - 1;
45+
let i = 0;
46+
while (i <= R) {
47+
while (nums[i] == 2 && i < R) { // 当前值为2,那么就和右边指针进行交换
48+
[nums[i], nums[R]] = [nums[R], nums[i]];
49+
R--;
50+
}
51+
while (nums[i] == 0 && i > L) { // 当前值为0,那么就和左边指针进行交换
52+
[nums[i], nums[L]] = [nums[L], nums[i]];
53+
L++;
54+
}
55+
i++;
56+
}
57+
return nums;
58+
};
59+
```
60+
61+
我想下面这份代码应该会更好理解一点:
62+
63+
```javascript
64+
/**
65+
* @param {number[]} nums
66+
* @return {void} Do not return anything, modify nums in-place instead.
67+
*/
68+
var sortColors = function (nums) {
69+
let len = nums.length;
70+
let L = 0;
71+
let R = len - 1;
72+
let i = 0;
73+
while (i <= R) {
74+
if (nums[i] == 0) { // 当前值为0,那么就和左边指针进行交换
75+
[nums[i], nums[L]] = [nums[L], nums[i]];
76+
L++;
77+
i++;
78+
} else if (nums[i] == 2) { // 当前值为2,那么就和右边指针进行交换
79+
[nums[i], nums[R]] = [nums[R], nums[i]];
80+
R--;
81+
} else {
82+
i++;
83+
}
84+
}
85+
return nums;
86+
};
87+
```
88+
89+
## 最后
90+
文章产出不易,还望各位小伙伴们支持一波!
91+
92+
往期精选:
93+
94+
<a href="https://github.com/Chocolate1999/Front-end-learning-to-organize-notes">小狮子前端の笔记仓库</a>
95+
96+
<a href="https://github.com/Chocolate1999/leetcode-javascript">leetcode-javascript:LeetCode 力扣的 JavaScript 解题仓库,前端刷题路线(思维导图)</a>
97+
98+
小伙伴们可以在Issues中提交自己的解题代码,🤝 欢迎Contributing,可打卡刷题,Give a ⭐️ if this project helped you!
99+
100+
101+
<a href="https://yangchaoyi.vip/">访问超逸の博客</a>,方便小伙伴阅读玩耍~
102+
103+
![](https://img-blog.csdnimg.cn/2020090211491121.png#pic_center)
104+
105+
```javascript
106+
学如逆水行舟,不进则退
107+
```
108+
109+

0 commit comments

Comments
 (0)