首页 > 其他分享 >每日一练——颜色分类(快慢指针排序)

每日一练——颜色分类(快慢指针排序)

时间:2024-05-23 20:58:00浏览次数:24  
标签:快慢 p0 p1 遇到 ++ int 排序 指针

目录

题目

代码

分析

案例模拟

重难点分析

自检复习 


题目

75. 颜色分类 - 力扣(LeetCode)

代码

//交换函数,交换指针a和指针b指向的整数
void swap(int *a, int *b){
    int t = *a;
    *a = *b;
    *b = t;
}

void sortColors(int* nums, int numsSize) {
    //双指针
    int p0 = 0, p1 = 0;
    //遍历数组
    for(int i = 0; i < numsSize; ++i){
        //把0丢给p0,此时如果p0<p1,也就是遇到过1,那p0指向的数必为1,需要把1丢给p1
        //p0左边都是0,p1左边排列好的0和1,p0在p1左边,所以p0所指必定为1
        if(0 == nums[i]){
            swap(&nums[i], &nums[p0]);
            if(p0 < p1){
                swap(&nums[i], &nums[p1]);
            }
            ++p0, ++p1;
        }
        //把1丢给p1,之后p1++
        else if(1 == nums[i]){
            swap(&nums[i], &nums[p1]);
            ++p1;
        }
        //指针总结
        //p0是慢指针只有在遇到0才++,所以p0左边都是0
        //p1是快指针,遇到0或1才++,所以p1左边都是0和1
    }
}

分析

案例模拟

i = 0


 i = 1

遇到了0,丢给p0,双指针++

 


i = 2


i = 3

遇到了1,丢给p1,p1++


i  = 4

遇到1,丢给p1,p1++ 


i = 5

遇到0,丢给p0,

此时p0 < p1,sums( i )的值丢给p1后,再双指针++ 

重难点分析

        这题最难理解的地方,在于遇到1,而且p0 < p1时,为什么要做这么麻烦的交换。也就是代码中的这部分:

        对应于上面案例分析中 i = 5 的时候。

        在这种解法中,p0是慢指针,只有在遇到0时才++,所以p0左边都是0;p1是快指针,遇到0或1时都会++,所以p1左边都是0和1,又因为p0已经把0都排好了,所以p1左边是按01排好的0和1。

        相对位置如下:

        所以,代码中p0 < p1 的含义在于,此时p0所指的一定是1,而1在与遇到的0交换后,还应该换到p1的脚下,这种情况下p0遇到的0的总数+1,p1遇到的0和1的总数也+1(有一对0和1内部交换),所以双指针++。

       


 而代码中的交换过程也显得比较复杂,还是靠图来辅助理解:

        可以看到,p0, p1和nums(i)他们相互交换了值,就像过节日三个好朋友互相交换礼物。

        再由上面的分析,我们可以知道,交换前p0的值为1,nums(i)的值为0,把数值填入能得到下表:

        可以看到,确实是实现了把0给p0,把1给p1的操作。

自检复习 

        如果你能完全分析出下面这个视频那就说明你真的有收获啦。

<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="EtmIdpEa-1716469047257" src="https://player.bilibili.com/player.html?aid=1504924740"></iframe>

每日一练——颜色分类(快慢指针排序)

标签:快慢,p0,p1,遇到,++,int,排序,指针
From: https://blog.csdn.net/weixin_73483158/article/details/139156333

相关文章

  • elasticsearch使用Sort排序时Please use a keyword field instead.
    具体报错信息ElasticsearchStatusException[Elasticsearchexception[type=search_phase_execution_exception,reason=allshardsfailed]];nested:ElasticsearchException[Elasticsearchexception[type=illegal_argument_exception,reason=Textfieldsarenotoptimised......
  • 代码随想录算法训练营第二天|977(双指针),209(滑动窗口),59(螺旋矩阵)
    977.有序数组的平方**1.数组中有正有负,且本身有序。平方后,较大值从两边来比较取出。**2.使用头尾指针方法。209.长度最小的子数组**1.从数组中找符合要求的连续子数组**2.滑动窗口方法:本质为快慢双指针,快指针不断前进直到子数组满足要求,然后慢指针前进直到子数组不满足......
  • 常见的排序算法——归并排序(五)
    本文记述了自然的两两归并排序并给出了一份参考实现代码。在说明了算法的性能后用随机数据进行了验证。◆思想自然的归并排序是自底向上的。先从第一个元素开始找到一个有序的子范围,然后从紧接着的后面元素开始找到另一个有序的子范围,将这两个子范围归并成一个大的有序子范围。......
  • 分布式任务调度内的 MySQL 分页查询优化 等值在前,排序在中间,范围在最后
    分布式任务调度内的MySQL分页查询优化https://mp.weixin.qq.com/s/VhSzxYIRv83T3D3JD4cORg三、优化方案 3.1优化方案确定 当前SQL执行计划以主键进行顺序遍历,是一个范围扫描,有点像在一片很大的居民区按照序号挨家挨户寻找一些特定的人一样,比较简单也比较低效。 既然......
  • C++类中封装指针函数
      classMyClass{public:voidfunc1(){//实现}voidfunc2(){//实现}//成员函数指针类型typedefvoid(MyClass::*MemberFuncPtr)();//一个成员函数指针成员变量MemberFuncPtrptrFunc;......
  • 并行计算排序
    #include<iostream>#include<vector>#include<chrono>#include<algorithm>#include<cstdint>#include<cstdlib>#include<omp.h>//StructuretoholddatastructData{intid;intage;floatweig......
  • jdk 中的 ImageIO 读取失败出现空指针
     在java8及之前版本中,jdk中的ImageIO读取图片内容会失败,解决办法使用java9或者使用第三方插件。插件可以使用 TwelveMonkeysImageIO,地址:https://github.com/haraldk/TwelveMonkeys使用方法,在maven中添加依赖<dependency><groupId>com.twelvemo......
  • 逗号分开的字符串,统计个数从高到底排序
    usesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,System.RegularExpressions, functionCompareStrings(List:TStringList;Index1,Index2:Integer):Integer;beginResult:=StrToInt(List.ValueF......
  • 代码随想录算法训练营第一天|704,34,35(二分查找),27(双指针)
    二分查找1.使用条件:数组,升序,值不唯一。2.时间复杂度O(logn)可分为左闭右闭,左闭右开两种区间类型来求解。左闭右闭:left=0,right=nums.Length-1,while(left<=right),right=middle-1.左闭右开:left=0,right=nums.Length,while(left<right),right=middle.......
  • 实验5_C语言指针应用编程
    Task1task1_11#include<stdio.h>2#defineN53#include<stdlib.h>45voidinput(intx[],intn);6voidoutput(intx[],intn);7voidfind_min_max(intx[],intn,int*pmin,int*pmax);89intmain(){10inta[N];11......