• 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]
  • 相关阅读:
    【网络编程】Linux网络编程基础与实战第一弹——网络基础
    【操作系统】8/35进程间通信
    在centos7上搭建hadoop集群
    学习笔记 谷粒02 Cloud
    在k8s中 ,数据包是怎么从外部流转进入到pod的?
    python详解(0.5)——水一篇基础知识
    AD批量修改用户属性值
    HJLL-99/A数字零序电流继电器
    华为云发布三大生态举措,携手伙伴及开发者共创新价值
    HashData的湖仓一体思考:Iceberg、Hudi特性讲解与支持方案
  • 原文地址:https://blog.csdn.net/xiaocui1995/article/details/127606181