【算法】分治-快排

news2025/5/28 2:13:40

个人主页 : zxctscl
如有转载请先通知

题目

  • 前言
  • 1. 75. 颜色分类
    • 1.1 分析
    • 1.2 代码
  • 2. 912. 排序数组
    • 2.1 分析
    • 2.2 代码
  • 3. 215. 数组中的第K个最大元素
    • 3.1 分析
    • 3.2 代码
  • 4. LCR 159. 库存管理 III
    • 4.1 分析
    • 4.2 代码

前言

分治就是分而治之

1. 75. 颜色分类

在这里插入图片描述

1.1 分析

就是把数组中的元素分为三块,0全部在左边,1全部在中间,2全部在右边。
这里要用到三个指针,一个i指针用来遍历,一个left用来存放0区域的最后侧,一个用来存放2区域的最左侧。
那么区间就分成了4个
在这里插入图片描述
只需要判断nums[i]的值是什么,然后把它放在对应区域。把数组遍历一遍就行,最终i只要等于right就结束遍历,此时中间已经没有要确定区域的数了。
在这里插入图片描述

1.2 代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left=-1,right=nums.size(),i=0;
        while(i<right)
        {
            if(nums[i]==0)
            {
                swap(nums[++left],nums[i++]);
            }
           else if(nums[i]==1)i++;
           else{
            swap(nums[--right],nums[i]);
           }
        }
        
    }
};

2. 912. 排序数组

在这里插入图片描述

2.1 分析

可以先选择一个元素作为基准,把比它小的元素都放在它的左边,把它大的都放在右边,中间放的数就和它相等,这样数组就分为三个区间,递归找一下左边,再递归找一下右边,直到数组全部被排好。
在这里插入图片描述

为了减少时间复杂度,选取基准值的时候选取随机数。
在这里插入图片描述

2.2 代码

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
    srand(time(NULL));
    qsort(nums,0,nums.size()-1);
    return nums;
    }

    void qsort(vector<int>& nums,int l,int r)
    {
        if(l>=r)return;
        int k=getRandom(nums,l,r);
        int i=l,left=l-1,right=r+1;
         while(i<right)
        {      
            if(nums[i]<k)
            {
                swap(nums[++left],nums[i++]);
            }
           else if(nums[i]==k)i++;
           else{
            swap(nums[--right],nums[i]);
           }
        }
        qsort(nums,l,left);
        qsort(nums,right,r);
    }
     int getRandom(vector<int>& nums,int left,int right)
     {
        int r=rand();
        return nums[r%(right-left+1)+left];
     }
};

3. 215. 数组中的第K个最大元素

在这里插入图片描述

3.1 分析

和上面那题一样,这里也将区间分三块。
随机选取一个基准元素k,根据这个基准元素将区间分三部分,左边都是小于k的,中间都是等于k的,有边都是大于k的。
题目要求找到的是第k大元素,那么在三个区域都有可以,但是如果确定这个第k大元素是在某一个区域的时候,那么剩下的两个区域就都不用考虑。
左边元素个数为a,中间为b,右边为c。
第一种如果在c区域,那么c大于等于k的,因为c区域放的是是大值区域,如果存在第k大的,那么最有可能就在c中,只需要c大于等于k就一定在。
在第二种情况找的时候,就说明第一种情况不存在,在中间的区域,那么就直接返回k就行,因为中间元素都是相等的。
第三种情况,前面两种情况都不存在,那么就在左边区间找,右边区域和中间区域都没有,那么找的就是第k-b-c大的元素。

在这里插入图片描述

3.2 代码

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
         srand(time(NULL));
         return qsort(nums, 0, nums.size() - 1,k);
    }

   int qsort(vector<int>& nums, int l, int r,int k)
   {
      if(l==r)return nums[l];
      int key=getRandom(nums,l,r);
       int i=l,left=l-1,right=r+1;

         while(i<right)
        {      
            if(nums[i]<key)
            {
                swap(nums[++left],nums[i++]);
            }
           else if(nums[i]==key)i++;
           else{
            swap(nums[--right],nums[i]);
           }
        }
        //分情况讨论
        int c=r-right+1,b=right-left-1;
        if(c>=k)return qsort(nums,right,r,k);
        else if(b+c>=k)return key;
        else return qsort(nums,l,left,k-b-c); 
         }

      int getRandom(vector<int>& nums,int left,int right)
     {
        int r=rand();
        return nums[r%(right-left+1)+left];
     }
};

4. LCR 159. 库存管理 III

在这里插入图片描述

4.1 分析

解法一:
可以直接排序,把前面的cnt个数重新放在一个vector表里面返回就行。

解法二:用快速选择算法
就是前面所提到的随机选择基准元素k,把数组分三个区间。
在这里插入图片描述
然后统计每一个区间的个数,此时就分为三种情况:
第一种情况:第k小,如果a>k就先从第一个区间找。
第二种情况:a+b大于等于k,那么就直接返回k就行,这个区间值都是相等的。
第三种情况:前面两种情况都不成立,说明这个k在右边这个区域,找k-a-b个元素就可以。

在这里插入图片描述

4.2 代码

解法一:

class Solution {
public:
    vector<int> inventoryManagement(vector<int>& stock, int cnt) {
    sort(stock.begin(),stock.end());
    vector<int> v;
    for(int i=0;i<cnt;i++)
    {
        v.push_back(stock[i]);
    }
    return v;
    }
};

解法二:

class Solution {
public:
    vector<int> inventoryManagement(vector<int>& stock, int cnt) {
         srand(time(NULL));
         qsort(stock, 0, stock.size() - 1,cnt);
         return {stock.begin(),stock.begin()+cnt};
    }

   void qsort(vector<int>& stock, int l, int r,int k)
   {
       if(l>=r)return;
       int key=getRandom(stock,l,r);
       int i=l,left=l-1,right=r+1;

         while(i<right)
        {      
          if(stock[i]<key) swap(stock[++left],stock[i++]);
           else if(stock[i]==key)i++;
           else swap(stock[--right],stock[i]);
        }

        //分情况讨论
        int a=left-l+1,b=right-left-1;
        if(a>k)qsort(stock,l,left,k);
        else if(a+b>=k) return;
        else  qsort(stock,right,r,k-a-b); 
         }

      int getRandom(vector<int>&stock,int left,int right)
     {
        int r=rand();
        return stock[r%(right-left+1)+left];
     }
    
};

有问题请指出,大家一起进步!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1593047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决vue3更新chunk包后,点击页面报错

出现错误 解决思路 试了好多方法&#xff0c;跳了很多坑&#xff0c;router版本对不上&#xff0c;解决方案不实用。最后我直接捕获异常&#xff0c;刷新页面&#xff0c;解决最快最有效。 // vue-rotuer版本 "vue-router": "^4.0.3"解决方案 在router/…

(学习日记)2024.04.18:UCOSIII第四十六节:CPU利用率及栈检测统计

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【iOS ARKit】Web 网页中嵌入 AR Quick Look

在支持 ARKit 的设备上&#xff0c;iOS 12 及以上版本系统中的 Safari浏览器支持 AR Quick Look&#xff0c; 因此可以通过浏览器直接使用3D/AR 的方式展示 Web 页面中的模型文件&#xff0c;目前 Web 版本的AR Quick Look 支持USDZ 格式文件。苹果公司有一个自建的3D模型示例库…

社交革命的引领者:探索Facebook的创新策略

1. 引言&#xff1a;社交媒体的崛起 社交媒体的兴起标志着信息时代的到来&#xff0c;它不仅改变了人们的生活方式&#xff0c;也影响着整个社会结构。作为社交媒体的先驱者&#xff0c;Facebook以其创新的策略和领先的技术&#xff0c;成为了这场社交革命的引领者。从2004年马…

Gradle 实战 - 启动main函数-ApiHug准备-工具篇-012

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

03 Git 之 远程仓库 + IDEA 集成使用 GitHub

1. 远程仓库 origin&#xff1a;即远程仓库 url 的指代。 从网上随意 clone 一个仓库&#xff0c;进入 .git/config 文件, 即可编辑远程仓库的 url&#xff0c;也可以自定义想要指代该 url 的名词。 1.1 本地仓库绑定远程仓库 并 推送、拉取 git remote add 【想要起的指代…

读所罗门的密码笔记19_治理模式

1. 解决方案 1.1. 全球人工智能的环境错综复杂&#xff0c;它严重依赖于价值观&#xff0c;且关系重大 1.2. 即使是与大家同仇敌忾的问题做斗争&#xff0c;也往往无法在国际社会中取得最佳效果 1.3. OPCW&#xff08;禁止化学武器组织&#xff09;已经帮助限制了化学武器的…

【嵌入式基础知识学习】AD/DA—数模/模数转换

AD/DA—数模/模数转换概念 数字电路只能处理二进制数字信号&#xff0c;而声音、温度、速度和光线等都是模拟量&#xff0c;利用相应的传感器&#xff08;如声音用话筒&#xff09;可以将它们转换成模拟信号&#xff0c;然后由A/D转换器将它们转换成二进制数字信号&#xff0c…

每日一题---移除元素

文章目录 1.题目名称2.题目思路2.1.思路1:2.2.思路2&#xff1a; 3.参考代码 每日一题—移除元素 1.题目名称 2.题目思路 2.1.思路1: 创建一个新的数组&#xff0c;将值不为val的放到新的数组&#xff0c;然后在返回新的数组的大小&#xff0c;但是题目专门说啦&#xff0c;这…

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

标定的是相机到雷达的,R3live下面配置的雷达到相机的,所以要把得到外参旋转矩阵求逆,再填入,平移矩阵则取负 港科大livox_camera_calib虽然操作方便&#xff0c;但是使用mid360雷达会有视角问题&#xff08;投影三维点到相机&#xff09;&#xff0c;尝试了很多场景&#xff0c…

连接参数a和b operator.concat(a, b)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 连接参数a和b operator.concat(a, b) [太阳]选择题 以下关于operator.concat()的功能和作用说法正确的是&#xff1a; import operator print("【执行】operator.concat(Hello, World)&q…

蓝桥杯嵌入式(G431)备赛笔记——DMA+ADC(单通道+多通道)

单通道&#xff1a; 开启循环模式&#xff0c;两个参数设为word u32 adc_tick0; u32 r37_value0; u32 r38_value0; float r37_volt0; float r38_volt0;//DMAADCvoid DMA_ADC() {if(uwTick-adc_tick<100) return;adc_tick uwTick;HAL_ADC_Start_DMA(&hadc2, &r37_v…

宝藏免费音乐软件LX music

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 宝藏免费音乐软件LX music 前言LX Music的特色功能&#xff1a;音乐播放的新境界安装与配置&#xff1a;在不同平台上使用LX Music下载页面 主题定制 本文将深入研究LX Music&#xff0c;一款备受欢迎…

2024/4/11 直流电机调速/PWM

一、直流电机简介和PWM原理 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&…

一招将vscode自动补全的双引号改为单引号

打开设置&#xff0c;搜索quote&#xff0c;在结果的HTML选项下找到自动完成&#xff0c;设置默认引号类型即可。 vscode版本&#xff1a;1.88.1&#xff0c; vscode更新日期&#xff1a;2024-4-10

2款Notepad++平替工具(实用、跨平台的文本编辑器)

前言 今天大姚给大家分享2款Notepad平替工具&#xff0c;实用、跨平台&#xff08;支持Window/MacOS/Linux操作系统平台&#xff09;的文本编辑器。 NotepadNext NotepadNext是一个跨平台的 Notepad 的重新实现。开发是使用 QtCreator 和 Microsft Visual C (msvc) 编译器完…

tested4142

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Springboot+Vue项目-基于Java+MySQL的母婴商城系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

软考高级架构师:图论应用-最短路径

一、AI 讲解 图论是数学的一个分支&#xff0c;主要研究图的性质。在图论中&#xff0c;最短路径问题是一个经典问题&#xff0c;它旨在找到图中两个顶点之间的最短路径长度。这个问题在很多实际应用中都非常重要&#xff0c;比如在网络路由、社交网络分析、城市交通规划等领域…

什么是智能组网?

智能组网已经成为现代社会中网络通信的重要技术。智能组网通过建立高效的网络连接&#xff0c;实现设备之间的信息传输和远程通信。它在不同地区的电脑与电脑、设备与设备、电脑与设备之间搭建了桥梁&#xff0c;极大地提升了信息传递的效率和便捷性。 天联是一种智能组网技术&…