长大后想做什么?做回小孩!

0%

LeetCode——颜色分类

NO.75 颜色分类 中等

8TnVmj.png

思路一:计数排序

看完题感觉就是个排序,题干里也说了直观的方法就是计数排序。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void sortColors(int[] nums) {
//计数
int[] counter=new int[3];
for (int num : nums) {
counter[num]++;
}
//重写
int idx=0;
for (int i=0;i<counter.length;i++) {
while (counter[i]-- > 0) {
nums[idx++]=i;
}
}
}

时间复杂度:O(n)

思路二:快速排序

用类似于简化三路快排的方式进行排序。用curr指向当前遍历元素,left指向左边放0的的位置,right指向右边放2的位置。

curr去进行遍历,遇到0交换到左边部分,遇到1继续遍历,遇到2交换到右边部分。保持left指向左边放0的部分的后一个位置,right指向右边放2的部分的前一个位置。直至curr>right结束遍历,就将数组按照0、1、2的顺序分成了三部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void sortColors(int[] nums) {
int left=0,right=nums.length-1,curr=0;
while (curr <= right) {
if (nums[curr] == 0) {
swap(nums,left,curr);
left++;
curr++;
} else if (nums[curr] == 1) {
curr++;
} else if (nums[curr] == 2) {
swap(nums,curr,right);
right--;
}
}
}

private void swap(int[] nums, int i, int j) {
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}

时间复杂度:O(n)


本人菜鸟,有错误请告知,感激不尽!

更多题解和源码:github