当前位置: 首页 > article >正文

算法-技巧-中等-颜色分类

记录一下算法题的学习12

颜色分类

题目:给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

 统计数组中0,1,2的个数,根据它们的数量,重写整个数组 代码展示:

class Solution {
    public void sortColors(int[] nums) {
        HashMap<Integer,Integer>  map=new HashMap<Integer,Integer>();
        map.put(0,0);
        map.put(1,0);
        map.put(2,0);
        //统计出数组中 0,1,2 的个数
        for(int num:nums){
             Integer count=map.get(num);
             map.put(num,(count+1));

          }
        //根据它们的数量,重写整个数组(强制)
        for (int i = 0; i < nums.length; i++) {
        if (i < map.get(0))
            nums[i] = 0;
        else if (i < map.get(0) + map.get(1))
            nums[i] = 1;
        else if (i < map.get(0) + map.get(1) + map.get(2))
            nums[i] = 2;
    }
    System.out.println(Arrays.toString(nums));
    }
}

不讲武德 使用 Arrays.sort() 函数 代码展示(题目答案顺序刚好符合,否则也用不了)

class Solution {
    public void sortColors(int[] nums) {
      Arrays.sort(nums);
  }
}

荷兰国旗问题 红白蓝 

 随机选择一个元素作为切分元素P1,然后经过一次扫描,通过交换不同位置的元素使得数组元素按照数值大小分为以下三个部分

举例说明:

class Solution {
    public void sortColors(int[] nums) {
        //如果不能满足红白蓝三种颜色分类排序,直接结束
       if(nums.length<2){
           return;
       } 
        //满足红白蓝三种颜色分类
        int p0=-1;
        int p1=0;
        int p2=nums.length;
        while(p2>p1){
            if(nums[p1]==0){
                p0++;
                swap(nums,p1,p0);
                p1++;
            }
            else if(nums[p1]==1){
                p1++;
            }
            else{
                p2--;
                swap(nums,p1,p2);
            }     
      }
  }
   //定义一个交换数组元素位置的功能函数方法
    public void swap(int[] nums,int index1,int index2){
        int temp=nums[index1];
        nums[index1]=nums[index2];
        nums[index2]=temp;
    }
}

leetcode中的解法是单指针和双指针解法,以下是复制粘贴代码

单指针
class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int ptr = 0;
        for (int i = 0; i < n; ++i) {
            if (nums[i] == 0) {
                int temp = nums[i];
                nums[i] = nums[ptr];
                nums[ptr] = temp;
                ++ptr;
            }
        }
        for (int i = ptr; i < n; ++i) {
            if (nums[i] == 1) {
                int temp = nums[i];
                nums[i] = nums[ptr];
                nums[ptr] = temp;
                ++ptr;
            }
        }
    }
}
双指针
class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int p0 = 0, p2 = n - 1;
        for (int i = 0; i <= p2; ++i) {
            while (i <= p2 && nums[i] == 2) {
                int temp = nums[i];
                nums[i] = nums[p2];
                nums[p2] = temp;
                --p2;
            }
            if (nums[i] == 0) {
                int temp = nums[i];
                nums[i] = nums[p0];
                nums[p0] = temp;
                ++p0;
            }
        }
    }
}

 结束拜拜!


http://www.kler.cn/a/144934.html

相关文章:

  • 扫描条形码到电脑:Barcode to pc 4.6.3 Crack
  • SpringBoot项目连接,有Kerberos认证的Kafka
  • csapp archlab part 1
  • SELinux零知识学习三十一、SELinux策略语言之角色和用户(2)
  • thingsboard的WebSocket API的使用
  • ts实现合并数组对象中key相同的数据
  • Deepin使用记录-deepin系统下安装RabbitMq
  • 从0到0.01入门 Webpack| 007.精选 Webpack面试题
  • PyCharm 安装插件Vue
  • LeetCode Hot100 102.二叉树的层序遍历
  • Canvas艺术之旅:探索锚点抠图的无限可能
  • MySQL数据库——存储函数(介绍、案例)
  • 精准人脉引流软件的开发流程与涉及到的技术
  • RabbitMQ简易安装
  • Go lumberjack 日志轮换和管理
  • 一次【自定义编辑器功能脚本】【调用时内存爆仓】事故排查
  • 深度学习之八(生成对抗网络--Generative Adversarial Networks,GANs)
  • C#,数值计算——有理函数插值和外推(Rational_interp)的计算方法与源程序
  • springsecurity6配置四
  • 基础组件-对Mybatis返回条数限制