Skip to content

Commit ca50c3e

Browse files
committed
75.颜色分类,双指针
1 parent 84bbb06 commit ca50c3e

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
69. x 的平方根
3434
70. 爬楼梯
3535
72. 编辑距离
36+
75. 颜色分类
3637
76. 最小覆盖子串
3738
77. 组合
3839
78. 子集

leetcode_Java/DoneType.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@
145145
41. 缺失的第一个正数
146146
54. 螺旋矩阵
147147
56. 合并区间
148+
75. 颜色分类
148149
88. 合并两个有序数组
149150
136. 只出现一次的数字
150151
169. 多数元素

leetcode_Java/Solution0075.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// 75. 颜色分类
2+
3+
4+
/*
5+
单指针:两次遍历,第一次把0交换到前面,第二次把1交换到前面
6+
*/
7+
class Solution {
8+
public void sortColors(int[] nums) {
9+
int index = 0, n = nums.length;
10+
for (int i = 0; i < n; i++) {
11+
if (nums[i] == 0) {
12+
swap(nums, i, index);
13+
index++;
14+
}
15+
}
16+
for (int i = index; i < n; i++) {
17+
if (nums[i] == 1) {
18+
swap(nums, i, index);
19+
index++;
20+
}
21+
}
22+
}
23+
24+
private void swap(int[] nums, int x, int y) {
25+
int temp = nums[x];
26+
nums[x] = nums[y];
27+
nums[y] = temp;
28+
}
29+
}
30+
31+
32+
/*
33+
双指针:
34+
1、p0、p2指针分别指向首尾
35+
2、遍历到p2指针位置时结束,防止交换完的元素2又被错误地换到前面
36+
3、由于可能存在2换2的情况,使用while循环将元素2交换到尾部,确保当前位置不是元素2
37+
4、当前位置的元素2交换完后,再判断交换元素0到头部
38+
*/
39+
class Solution {
40+
public void sortColors(int[] nums) {
41+
int n = nums.length;
42+
int p0 = 0, p2 = n - 1;
43+
for (int i = 0; i <= p2; i++) {
44+
while (i <= p2 && nums[i] == 2) {
45+
swap(nums, i, p2);
46+
p2--;
47+
}
48+
if (nums[i] == 0) {
49+
swap(nums, i, p0);
50+
p0++;
51+
}
52+
}
53+
}
54+
55+
private void swap(int[] nums, int x, int y) {
56+
int temp = nums[x];
57+
nums[x] = nums[y];
58+
nums[y] = temp;
59+
}
60+
}

0 commit comments

Comments
 (0)