首页 > 编程语言 >java数据结构与算法刷题-----LeetCode75. 颜色分类

java数据结构与算法刷题-----LeetCode75. 颜色分类

时间:2024-03-24 12:00:55浏览次数:33  
标签:p2 p0 p1 java LeetCode75 int nums ----- 位置

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

在这里插入图片描述

1. 双指针两次遍历

解题思路:时间复杂度O( n n n),空间复杂度O( 1 1 1),需要遍历两次数组
  1. 第一遍遍历,将所有0放到前面
  2. 第二遍遍历,将所有1放在0后面
代码

在这里插入图片描述

class Solution {
    //交换
    public static void changePosition(int arr[],int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    public void sortColors(int[] nums) {
        int n = nums.length;
        int left = 0;//指向交换位置
        for(int right = 0;right<n;right++){//将0换到left位置
            if(nums[right] == 0) changePosition(nums,left++,right);
        }
        for(int right = left;right<n;right++){//将1换到left位置
            if(nums[right] == 1) changePosition(nums,left++,right);
        }
    }
}

2. 三指针

解题思路:时间复杂度O( n n n),空间复杂度O( 1 1 1),只遍历1次数组
  1. p0指向下一个0需要放置的位置,同理p1指向下一个1需要放置的位置
  2. 我们使用p2指针来进行遍历数组,如果发现p2指向的是1就和p1位置交换,同时p1++
  3. 当p2指向0时,需要和p0交换,但是有一种特殊情况
  1. 例如0011220,其中1是p0位置,2是p1位置,0是p2位置
  2. 此时,我们发现p1的位置是超过p0的,也就是说,此时p1后面一定是1,而p0的下一个插入位置,就在p1的后面,也就是p0比如指向1
  3. 此时我们要让p0和p2交换位置,结果为0001221。我们发现,虽然现在p0位置放上了0,但是p0原来指向的1,却放到了p2位置
  4. 也就是说,我们为了换一个0,把1交给了p2.此时就需要p1和p2将这个1要回来
  5. 因此只要我们p0和p2交换完成后,发现p0<p1,就需要再让p1和p2额外进行一次交换,结果为0001122
代码

在这里插入图片描述

class Solution {
    //交换
    public static void changePosition(int arr[],int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    public void sortColors(int[] nums) {
        int p0 = 0;int p1 = 0;int p2 = 0;//三快慢指针,p2最快,p1其次,p0最后
        while(p2<nums.length) {//
            if(nums[p2] == 1) changePosition(nums,p1++,p2);//如果当前p2指向1,则和p1指针交换
            else if(nums[p2] == 0) {//如果当前p2是0
                changePosition(nums,p0,p2);//和p0交换位置
                //如果此时p0和p1指向的位置不是同一个,也就是p1在p0前面,那么说明p0当前位置原来是1
                //p0和p2交换后,也就是将p2位置的0放到了p0位置。而p0原来位置的1,放在了p2位置
                //此时就需要将p2位置的1,换给p1.也就是必须p1和p2再次交换
                if(p0<p1) changePosition(nums,p1,p2);
                p0++;p1++;//0向前走,1就得向前走
            }
            p2++;
        }
    }
}

标签:p2,p0,p1,java,LeetCode75,int,nums,-----,位置
From: https://blog.csdn.net/grd_java/article/details/136984691

相关文章

  • Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)
    Lecture06Rasterization2(AntialiasingandZ-Buffering)Antialiasing反走样采样理论发生在不同位置(如照相)发生在不同时间(如动画)SamplingArtifacts(指图形学中的错误、看上去不对的地方、瑕疵)锯齿摩尔纹Wagonwheeleffect行进的车轮看起来似乎是向后转的......
  • java数据结构与算法刷题-----LeetCode451. 根据字符出现频率排序
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录1.hash统计出现次数后排序2.桶排序1.hash统计出现次数后排序解题思路:时间复杂度O(......
  • nginx挂载配置文件和日志-静态目录-方式二
    环境说明linux系统版本:lsb_release-a docker版本:docker-v Nginx镜像版本:1.24.0 不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。 .1.创建需要挂载的文件目录,比如html和log,还有配置文件nginx.conf.自己首先创建一个目录,结构如下。 ......
  • 数据分析-Pandas分类数据的类别处理
    数据分析-Pandas分类数据的类别处理数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律?数据表,时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。数据分析......
  • 【CSP试题回顾】202303-2-垦田计划(优化)
    CSP-202303-2-垦田计划关键点:二分查找在这个问题中,有一系列的田地需要在特定的时间tit_iti......
  • flutter3-dylive仿抖音App实例|Flutter3+Getx实战短视频直播应用
    原创研发flutter3+getX+mediaKit跨平台仿抖音app短视频直播实战Flutter3-DouYin。flutter3_dylive使用最新跨平台技术flutter3.x+dart3+getx+get_storage+media_kit开发手机端仿抖音app小视频直播实战项目。实现了抖音全屏式上下滑动视频、左右滑动切换页面模块,直播间进场/礼物动......
  • 2023 dl实战精选-基于Keras的深度神经网络应用实战
    本书介绍    深度学习是一组令人兴奋的神经网络新技术。通过高级的训练技术和神经网络架构组件的组合就可以创建能够处理表格数据、图像、文本和音频作为输入和输出的神经网络。深度学习允许神经网络以类似于人脑功能的方式学习信息的层次结构。免费获取:2023dl实战精......
  • 刚刚!奥特曼剧透GPT-5,将在高级推理功能上实现重大进步
    奥特曼:“GPT-5的能力提升幅度将超乎人们的想象…”自Claude3发布以来,外界对GPT-5的期待越来越强。毕竟Claude3已经全面超越了GPT-4,成为迄今为止最强大模型。而且距离GPT-4发布已经过去了整整一年时间,2023年3月14日OpenAI官宣发布GPT-4。关于GPT-4.5或GPT-5......
  • C#9.0新特性详解系列之四:顶级程序语句(Top-Level Programs)
    原文链接:https://www.cnblogs.com/markkang/p/14091908.html1背景与动机通常,如果只想用C#在控制台上打印一行“HelloWorld!”,这可不是Console.WriteLine("HelloWorld!");一条语句就可以搞定的,还涉及到其他必要基础代码(如定义类和入口函数Main),例如下面:usingSystem;classProgr......
  • 3.MySQL数据库的基本操作-DQL 基本操作
    MySQL数据库的基本操作-DQL基本操作查询select语法格式select[all|distinct]<目标列的表达式1>[别名],<目标列的表达式2>[别名]...from<表名或视图名>[别名],<表名或视图名>[别名]...[where<条件表达式>][groupby<列名>[having<条件表达式>]][o......