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

力扣——颜色分类

题目链接:

链接

题目描述:

在这里插入图片描述

思路:

思路一

类似于冒泡排序,遍历一次nums,把0都放在前面,然后再遍历一次,把1放在0后面,剩下的就都是

思路二

上面用一个指针遍历了两次,可以用两个指针只遍历一次

令P0之前的都为0,P1之前的都为1

  1. 刚开始P0和P1就在索引0处,遍历一次nums
  2. 遇到0,和P0交换,遇到1,和P1交换,然后指针前移
  3. 如果 p0 < p1,说明在P0和P1中间有个1,在交换 0 的过程中,将一个 1 交换到了前面,而现在又把0交换到了前面,这个0就占用了1的位置,此时这个1放在了后面,所以需要将这个 1 再交换到 p1 的位置。然后P0++,P1++

思路三

同样用两个指针只遍历一次

令P0之前的都为0,P2之前的都为2

  1. 刚开始P0在索引0处,P2在索引n-1处,遍历一次nums
  2. 遇到0,和P0交换,遇到2,和P2交换,P0前移,P2后移,
  3. 遇到2,和nums[P2]交换,如果nums[P2]也等于2,就会把一个2放在前面,而且不会再遍历到(i一直++,这里已经经过这个位置了,所以不会再遍历到),所以需要循环直到nums[i] != 2
  4. 如果i>P2,就不需要再遍历了

实现代码:

class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int p = 0;
        //遍历找到0,移动
        for(int i = 0; i < n; i++){
            if(nums[i] == 0){
                int tmp = nums[i];
                nums[i] = nums[p];
                nums[p] = tmp;
                p++;
            }
        }
        //遍历找到1,移动
        for(int i = p; i < n; i++){
            if(nums[i] == 1){
                int tmp = nums[i];
                nums[i] = nums[p];
                nums[p] = tmp;
                p++;
            }
        }
    }
}
class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int p0 = 0, p1 = 0;
        for(int i = 0; i < n ; i++){
            if(nums[i] == 0){
                int tmp = nums[i];
                nums[i] = nums[p0];
                nums[p0] = tmp;
                if(p0 < p1){
                    tmp = nums[i];
                    nums[i] = nums[p1];
                    nums[p1] = tmp;
                }
                p0++;
                p1++;
            }else if(nums[i] ==1){
                int tmp = nums[i];
                nums[i] = nums[p1];
                nums[p1] = tmp;
                p1++;
            }
        }
    }
}
class Solution {
    public void sortColors(int[] nums) {
        int n = nums.length;
        int p0 = 0, p2 = n-1;
        for(int i = 0; i < n; i++){
            if(nums[i] == 0){
                int tmp = nums[i];
                nums[i] = nums[p0];
                nums[p0] = tmp;
            }
            while(nums[i] == 2 && i <= p2){
                int tmp = nums[i];
                nums[i] = nums[p2];
                nums[p2] = tmp;
                p2--;
            }
        }
    }
}

相关文章:

  • 【prometheus】Pushgateway安装和使用
  • QT——c++界面编程库
  • yolov8,yolo11,yolo12 服务器训练到部署全流程 笔记
  • 鸿蒙ArkTs开发,后台触发数据变化后更新页面 UI事件
  • 【折线图 Line】——1
  • 影刀RPA中级案例总结
  • 运维Apache面试题及参考答案
  • 17 款电脑压缩工具详解及下载指南(2025 年最新版)
  • Express + MongoDB 实现文件上传
  • ‌Debian 包版本号比较规则详解
  • c++中初始化列表的使用
  • 攻防世界WEB(新手模式)18-easyphp
  • Vue打包(webpack)缓存
  • DCDC60V电源ic,支持48V降压5V、36V降压5V,SL3037B替换TPS54362
  • final 关键字在不同上下文中的用法及其名称
  • Spring Data JPA 中的分页实现:从 BasePage 到 Pageable
  • Dify使用和入门
  • 浮点数在内存中的存储
  • 使用Spring Data Redis操作Redis
  • 学习threejs,使用ShaderMaterial自定义着色器材质
  • 领先的手机网站设计/网站软文代写
  • 现在推广网站最好的方式/谷歌浏览器入口
  • 郑州网络推广方法/王通seo
  • 思勤传媒网站建设公司/精品成品网站入口
  • 做网站找公司怎么找/网页制作费用大概多少
  • 做seo的网站/上海网络优化seo