LeetCode 75. 颜色分类

题目对应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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值