题目对应LeetCode官网地址:75. 颜色分类
Java实现代码:
package array;
import java.util.Arrays;
/**
* @ClassName LeetCode 75.颜色分类
* @Description https://leetcode.cn/problems/sort-colors/
* @Author Jiangnan Cui
* @Date 2022/10/30 19:58
* @Version 1.0
*/
public class LeetCode75 {
/**
* @MethodName sortColors
* @Description 方法1:双层for循环
* 时间复杂度:O(n)
* 空间复杂度:O(k),其中k为元素范围,此题中k=3,可看做O(1)
* 满足题目要求,但需要进行两次循环
* @Author Jiangnan Cui
* @Date 21:12 2022/10/30
*/
public void sortColors(int[] nums){
// 新建数组分别对0、1、2计数,初始每个元素个数为0
int[] count = {0,0,0};
// 遍历数组
for (int i = 0; i < nums.length; i++) {
// 避免出现0、1、2以为的数字,导致数组下标越界
assert nums[i]>=0 && nums[i]<=2;
// 对nums[i]分别计数,例:num[i]=0、count[nums[i]]++ =count[0]++,即对count[0]进行累加操作
count[nums[i]]++;
}
// 将0、1、2分别放回原数组
int index = 0;
for (int i = 0; i < count[0]; i++) {
nums[index++] = 0;
}
for (int i = 0; i < count[1]; i++) {
nums[index++] = 1;
}
for (int i = 0; i < count[2]; i++) {
nums[index++] = 2;
}
}
/**
* @MethodName sortColors2
* @Description 方法2:三路快速排序
* 时间复杂度:O(n)
* 空间复杂度:O(1)
* 满足题目要求
* @Author Jiangnan Cui
* @Date 21:20 2022/10/30
*/
public void sortColors2(int[] nums){
// -1, [0,...,zero,...,two,...,nums.length-1], nums.length
// -1 [ 0元素区间 ] [ 1元素区间 ] [ 带遍历元素区间 ] [ 2元素区间 ] nums.length
// nums[0,...,zero]==0
int zero = -1;
// nums[two,...,nums.length-1]==2
int two = nums.length;
for (int i = 0; i < two;) {
if(nums[i] == 1){
// 遍历的元素==1时,i直接加1向右移动即可
i++;
}else if(nums[i] == 0){
// 遍历的元素==0时,与数组0区间范围对应的下一个元素作交换,即zero区间长度向右移动一位长度+1,同时zero的大小也要加1,因此用++zero,由于交换过来的0占据了1元素的位置,此时交换后的元素1不需要再判断,所以需要i++,注意zero++与++two的区别
swap(nums, ++zero, i++);
}else if(nums[i] == 2){
// 遍历的元素==2时,与数组2区间范围对应的前一个元素作交换,即two区间长度向左移动一位长度+1,同时two的大小也要减1,因此用--two,交换后的元素还需要再进行判断,所以此处不用改变位置,即不用i++,注意two--与--two的区别
swap(nums, --two, i);
}
}
}
/**
* @MethodName swap
* @Description 交换数组中两个元素的位置
* @param: nums
* @param: i
* @param: j
* @Author Jiangnan Cui
* @Date 21:20 2022/10/30
*/
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void main(String[] args) {
int[] nums = {2,2,2,1,1,0};
new LeetCode75().sortColors(nums);
System.out.println(Arrays.toString(nums));
int[] nums2 = {2,2,2,1,1,0};
new LeetCode75().sortColors2(nums2);
System.out.println(Arrays.toString(nums2));
}
}
输出结果:
[0, 1, 1, 2, 2, 2] [0, 1, 1, 2, 2, 2]
博客给出LeetCode官网75. 颜色分类题目的对应地址,并展示了该题目的Java实现代码及输出结果,聚焦于LeetCode题目解答。
545

被折叠的 条评论
为什么被折叠?



