首页 > 其他分享 >75.颜色分类

75.颜色分类

时间:2024-03-25 22:35:16浏览次数:13  
标签:index 颜色 nums int 分类 length ++ 75 指针

image-20240325164500994

自己的思路:

思路和移动零一样,只是进行了两次移动,第一次为”移动2“,第二次为倒着的”移动0“(将0全部移动到最前面),中间自然会剩下1

自己的代码

class Solution {
    public static void sortColors(int[] nums) {
        // ”移动2“
        int i = 0;
        int j = 0;
        while(j < nums.length){
            if(nums[j] != 2){
                nums[i] = nums[j];
                i ++;
            }
            j ++;
        }
        for(;i < nums.length; i ++)
            nums[i] = 2;

        // 倒着移动零
        i = nums.length - 1;
        j = nums.length - 1;
        while(j >= 0){
            if(nums[j] != 0){
                nums[i] = nums[j];
                i --;
            }
            j --;
        }
        for(;i >= 0; i --)
            nums[i] = 0;
    }
}

image-20240325174736507

吴师兄的:三指针

左指针,右指针,中间指针,中间指针遍历,遇到0则和左指针交换,遇到2则和右指针交换(这里要观察一轮,index指针不能马上++)

class Solution {
    public void sortColors(int[] nums) {
        
        // left  指向数组的开始的位置,它指向的位置左侧都是 0
        int left = 0;

        // right  指向数组的结束的位置,它指向的位置右侧都是 2
        int right = nums.length - 1;

        // index 指向数组的开始位置
        int index = 0;

        // index 向后移动,当它越过 right 时跳出循环,不需要再判断了
        // 因为此时说明 index 右侧的都已经是 2
        while( index <= right ){

            // 获取当前的元素值
            int cur = nums[index];
            
            // 如果 index 位置上的元素值为 0
            if(cur == 0){
              // 说明是红色,要放在最前面去
              // 最前面的那个元素被 left 指着,所以让 index 指向的元素和 left 指向位置上的元素进行交换
              swap(nums,left,index);

              // index 可以向后移动
              index++;

              // left 可以向后移动,它的左侧区域都是 0
              left++;

              // 如果 index 位置上的元素值为 1
            }else if(cur == 1){
                // 说明是白色,就应该放在中间,不用管它,继续移动 index
                index++;

                // 如果 index 位置上的元素值为 2
            }else if(cur == 2){

                // 说明是蓝色,要放在最后面
                // 所以让 index 指向的元素和 right 指向位置上的元素进行交换
                swap(nums,right,index);

                // 由于原先 right 指向的元素可能为 0、1、2 这三种的任何一种
                // 交换到了 index 后,还需要继续观察一轮,所以 index 先不移动
                right--;
            }
        }

    }

    // 通过中间变量,交换两个元素的值
    // nums[i] 的值变为了 nums[j] 的值 
    // nums[j] 的值变为了 nums[i] 的值 
    private void swap(int[] nums, int i ,int j){
        // 使用临时变量 temp,保存 nums[i] 的值
        int temp = nums[i];
        
        // nums[i] 的值修改为 nums[j] 的值
        nums[i] = nums[j];

        // nums[i] 的值修改为 temp 的值
        nums[j] = temp;
    }
}

官方题解:

单指针:其实也是双指针

class Solution {
    public static void sortColors(int[] nums) {
        int i = 0;
        int head = -1;
        int max = nums.length;
        // 移动零
        while(i < max){
            if(nums[i] == 0){
                head ++;
                swap(nums, i, head);

            }
            i ++;
        }
        // 移动1
        i = head + 1;
        while(i < max){
            if(nums[i] == 1){
                swap(nums, i , head+1);
                head ++;
            }
            i ++;
        }
    }

    public static void swap(int[] arrays, int a, int b){
        int temp = arrays[a];
        arrays[a] = arrays[b];
        arrays[b] = temp;
    }
}

标签:index,颜色,nums,int,分类,length,++,75,指针
From: https://www.cnblogs.com/lmc7/p/18095564

相关文章

  • 激光雷达原理、分类和发展趋势
    激光雷达原理、分类和发展趋势本篇是激光雷达系列的第一篇文章,主要介绍激光雷达的基本原理、分类和发展趋势。附赠自动驾驶学习资料和量产经验:链接1.基本概念和分类1.1简介激光雷达(Lidar,LaserDetectingandRanging,激光探测和测距)是一种通过发射和接收激光束,来实现目标......
  • 加密算法概述:分类与常见算法
    码到三十五:个人主页心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得!在信息安全领域,加密技术是保护数据不被未授权访问的关键手段。Java作为一种广泛使用的编程语言,提供了丰富的加密API,支持多种加密算法。本文将介绍Java中加密算法的分类以及常见的......
  • Data.olllo:轻松统计分类总数!
    介绍:Data.olllo是您数据处理的得力助手,拥有众多强大的功能,其中之一便是“分类总数”功能。这个功能能够帮助您快速准确地统计某一列中不同分类的总数,无论是分类为A、B、C,还是其他自定义分类,都能轻松应对。功能简介:数据处理时,统计不同分类的总数是一项常见的需求。Data.olllo......
  • 解析环境因素对 AI 图像分类的影响及应对方法
    解析环境因素对AI图像分类的影响及应对方法随着人工智能技术的不断发展,图像分类在各个领域中扮演着越来越重要的角色。然而,图像分类的性能受到环境因素的影响,这些因素可能包括光照条件、背景干扰、视角变化、图像质量、遮挡等。本文将探讨环境因素对AI图像分类的影响,并提出一......
  • 【医学实体识别】从糖尿病论文和临床指南中,做关键信息分类
    从糖尿病论文和临床指南中,做关键信息分类实体识别输入输出疾病实体治疗实体常规实体算法设计BiLSTM-CRF论文BiLSTM-CRF应用BiLSTM-CRFVS大模型构建知识图谱 实体识别比赛:https://tianchi.aliyun.com/competition/entrance/231687/information如果你有......
  • 机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
    目录前言一、什么是线性回归二、什么是逻辑回归三、基于Python和Scikit-learn库实现线性回归示例代码: 使用线性回归来预测房价:四、基于Python和Scikit-learn库实现逻辑回归五、总结 线性回归的优缺点总结:逻辑回归(LogisticRegression)是一种常用的分类算法,......
  • AT_arc175_a [ARC175A] Spoon Taking Problem 题解
    题目翻译link有\(N\)人围坐在一张圆桌旁,按逆时针顺序编号为\(1\)至\(N\)。每个人都有一个惯用手圆桌上有\(N\)把勺子,编号为\(1\)到\(N\),每对相邻的人之间放一把勺子给你一个\((1,\dots,N)\)的排列组合\((P_1,\dots,P_N)\)。在\(i=1,\dots,N\)的顺序中,人......
  • 按键精灵-搜索给定区域内最后一个符合颜色值的坐标
    Functionget_lastPoint_coordinate_v2(left_x,left_y,right_x,right_y,color_value)//搜索给定区域的最后一个符合color_value颜色值的坐标,若是不存在,就返回-1,-1Dimresult_x,result_yresult_x=-1result_y=-1//若是给定的区域是反向区域......
  • 阿里二面:Java中锁的分类有哪些?你能说全吗?
    引言在多线程并发编程场景中,锁作为一种至关重要的同步工具,承担着协调多个线程对共享资源访问秩序的任务。其核心作用在于确保在特定时间段内,仅有一个线程能够对资源进行访问或修改操作,从而有效地保护数据的完整性和一致性。锁作为一种底层的安全构件,有力地防止了竞态条件和数据不......
  • 【兆易创新GD32H759I-EVAL开发板】USB设备 介绍1
    一、引言在当今数字化快速发展的时代,USB(通用串行总线)作为一种普遍应用的通信接口,在各种电子设备中发挥着不可或缺的作用。它不仅支持高速数据传输,而且支持热插拔,使设备连接更加方便快捷。兆易创新的GD32H7系列微控制器,凭借其卓越的计算性能和丰富的通信功能,为USB设备的开发提......