LeetCode刷题 -- 分治快排

news2024/12/27 8:16:22

目录

  • 颜色分类
    • 题目解析
    • 算法原理
    • 代码
  • 排序数组
    • 题目解析
    • 算法原理
    • 代码
  • 数组中第K个最大元素
    • 题目解析
    • 算法原理
    • 代码
  • LCR 159. 库存管理 III
    • 题目解析
    • 算法原理
    • 代码

颜色分类

题目链接

题目解析

数组分为三块

在这里插入图片描述

算法原理

1.如果nums[i] == 0,++left, i++下标对应元素交换,先++left后元素对应是1,和0元素交换,再i++

2.如果nums[i] == 2,- -right,i下标对应元素交换,先- -right,对应元素是未知的未扫描的,和2交换,i下标对应元素是未知的,不能++还要进行下一次的判断

3.如果nums[i] == 1,直接++i,因为i下标的左边都是1,++后左边还都是1

在这里插入图片描述

代码

class Solution 
{
public:
    void sortColors(vector<int>& nums) 
    {
        // 三指针,数组分成三块
        int left = -1,i = 0,right = nums.size();
        // i == right结束循环
        // 0 1 2 left边缘到右边 right边缘到左边
        while(i < right)
        {
           if(nums[i] == 0)
           swap(nums[++left],nums[i++]);
           else if(nums[i] == 1)
           i++;
           else
           swap(nums[--right],nums[i]);
        }
    }
};

排序数组

排序数组题目链接

题目解析

排成一个升序的数组

在这里插入图片描述

算法原理

随机选数和三路划分
1.三路划分:选出==key,<key,>key的,按照颜色分类那题一样的做法
2.随机选数:选数的范围是在[left,right]中的一个随机值,每一次排序选一个随机数
r = rand() nums[r % (right - left + 1) + left]
再加一个left是因为偏移量,让它能够在[left,right]区间中
[0,n-1-left] -> [left,n-1 ]-> [left,right]

在这里插入图片描述

代码

class Solution 
{
public:
    int func(vector<int>& nums,int l,int r)
    {
        int k = rand();
        // 保证选数在[l,r]之间 
        return nums[k % (r - l + 1) + l];
    }
    void qsort(vector<int>& nums,int l,int r)
    {
        // 有空数组和1个数的数组的情况
        if(l >= r)
        return;
        
        // 选数
        int key = func(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]);
        }

        // 递归
        // [l,left] [left + 1,right - 1] [right,r]
        qsort(nums,l,left);
        qsort(nums,right,r);
    }

    vector<int> sortArray(vector<int>& nums) 
    {
        srand(time(NULL));// 设置随机数的种子
        // 数组分成三份  优化随机选数
        qsort(nums,0,nums.size()-1);
        return nums;
    }
};

数组中第K个最大元素

题目解析

在这里插入图片描述

算法原理

1.可以用堆排序找第K大的元素
2.还可以用快排的选择
快排的选择跟上一题的逻辑很像

第K大的元素一定落在第一次数组分成三份的某一个区间内,所以只要去其中一个区间用快排可以解决,要注意的是第三种情况,传k时要传k-b-c,a,b,c都表示区间中元素的个数,k-b-c表示在第一个区间内找第K大的

第一种情况在c中找第K大的
第二种第K大的落在里面就是key了

在这里插入图片描述

代码

class Solution 
{
public:
    // 把数组分成三份
    int Selectnums(vector<int>& nums,int left,int right)
    {
        // 随机选数
        int r = rand();
        return nums[r % (right - left + 1) + left];
    }
    int qsort(vector<int>& nums,int left,int right,int k)
    {
        //返回条件
        // 只有一个元素
        // 没有空数组的情况因为要找第K大的数,至少要有一个数,有一个数的数组
        if(left == right)
        return nums[left];

        int key = Selectnums(nums,left,right);
        int i = left,l = left - 1,r = right + 1;
        while(i < r)
        {
            if(key == nums[i]) i++;
            else if(key > nums[i]) swap(nums[++l],nums[i++]);
            else swap(nums[--r],nums[i]);
        }

        // 递归
        // [left,l] [l+1,r-1] [r,right]
        // [0,l++]            [r--,n-1]
        int a = l - left + 1;
        int b = r - l - 1;
        int c = right - r + 1;
        if(c >= k)
        return qsort(nums,r,right,k);
        else if((b+c) >= k)
        return key;
        else
        return qsort(nums,left,l,k - b - c);
    }
    int findKthLargest(vector<int>& nums, int k) 
    {
       // 随机选数
       srand(time(NULL));
       int n = nums.size();
       
       return qsort(nums,0,n-1,k);
    }
};

LCR 159. 库存管理 III

题目链接

题目解析

以任意顺序返回题目中的K个最小元素

在这里插入图片描述

算法原理

快速选择算法和上一题类似

  1. a个 > k个,在[l,left]区域排序最小的k个元素
  2. a + b个 >= k个,在[l,right]区域中,直接返回key,因为key左边(包括key)一定是排好大小的,所以返回
  3. 前二种情况都不满足,在[right,r]区域中找k-a-b个最小的元素
  4. a == k的情况,肯定排好了,直接返回,因为<=key这变都是有序的
  5. [2,5,7,4] -> 2作为key [2,4,5,7]是排好后的
    [2,4,5,7]这种a > k还要排序,k在key的后面
    [2,5,7,4] -> 5作为key [2,4,5,7]是排好后的
    key 左边都是有序的

在这里插入图片描述

代码

class Solution 
{
public:
    // 随机选数
    int GetRound(vector<int>& nums,int left,int right,int k)
    {
        int r = rand();
        return nums[r % (right - left + 1) + left];
    }
    vector<int> inventoryManagement(vector<int>& stock, int cnt) 
    {
        srand(time(NULL));
        qsort(stock,0,stock.size()-1,cnt);
        return {stock.begin(),stock.begin()+cnt};
        // int n = stock.size();
        // sort(stock.begin(),stock.end());
        // vector<int> ret;
        // int i = 0;
        // while(cnt--)
        // {
        //     ret.push_back(stock[i++]);
        // }
        // return ret;
    }
    void qsort(vector<int>& nums,int l,int r,int k)
    {
        if(l >= r) return;

        int key = GetRound(nums,l,r,k);
        int i = l,left = l - 1,right = r + 1;
        while(i < right)
        {
            if(key > nums[i]) swap(nums[++left],nums[i++]);
            else if(key == nums[i]) i++;
            else swap(nums[--right],nums[i]);
        }

        // [l,left] [left + 1,right - 1] [right,r]
        int a = left - l + 1,b = right - left - 1,c = r - right + 1;
        if(a > k) qsort(nums,l,left,k);
        else if(a + b >= k) return;
        else qsort(nums,right,r,k - a - b);
    }
};

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

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

相关文章

【论文笔记】Leveraging the Power of MLLMs for Gloss-Free Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Leveraging the Power of …

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前&#xff0c;TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore&#xff0c;完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

如何抓取亚马逊页面动态加载的内容:Python爬虫实践指南

引言 在现代电商领域&#xff0c;数据的重要性不言而喻。亚马逊作为全球领先的电商平台&#xff0c;其页面上动态加载的内容包含了丰富的商品信息。然而&#xff0c;传统的爬虫技术往往难以应对JavaScript动态加载的内容。本文将详细介绍如何使用Python结合Selenium工具来抓取…

tcpdump抓包wireshark分析

背景 分析特定协议的数据包&#xff0c;如 HTTP、DNS、TCP、UDP 等&#xff0c;诊断网络问题&#xff0c;例如连接故障、延迟和数据包丢失。 大概过程 1.安装tcpdump yum update yum install tcpdump2.抓包&#xff0c;从当前时间起&#xff0c;一小时后停止&#xff0c…

如何进行Appium实现移动端UI自动化测试呢?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 为什么要使用…

骨架行为识别-论文复现

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Unity 设计模式-观察者模式(Observer Pattern)详解

观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系。当一个对象的状态发生变化时&#xff0c;它的所有依赖者&#xff08;观察者&#xff09;都会收到通知并自动更新。这种模式用于事件处理系…

【webApp之h5端实战】首页评分组件的原生实现

关于评分组件,我们经常在现代前端框架中用到,UI美观效果丰富,使用体验是非常不错的。现在自己动手使用原生js封装下评分组件,可以用在自己的项目中。 组件实现原理 点击的❤左侧包括自己都是高亮的样式,右侧都是灰色的样式,这样就能把组件的状态区分开了。右边再加上辅…

unity与android拓展

一.AndroidStudio打包 1.通过Unity导出Android Studio能够打开的工程 步骤 1.设置导出基本信息&#xff1a;公司名、游戏名、图标、包名等关键信息 2.在File——>Build Settings中&#xff0c;勾选 Export Project 选项 3.点击Export 导出按钮 2.在Android Studio中打开Un…

几种常见的javascript设计模式

摘要 最近开发HarmonyOSApp&#xff0c;使用的Arkts语言&#xff0c;此语言类似后端C#语言风格&#xff0c;同时兼顾写后端接口的我突然想总结一下近8年前端开发中无意中使用的设计模式&#xff0c;我们用到了却不知属于哪些&#xff0c;下面和大家分享一下。 什么是前端设计…

2.4特征预处理(机器学习)

2.4特征预处理 2.4.1 什么是特征预处理 通过 一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。 1 包含内容 数值型数据的无量纲化&#xff1a; 归一化 标准化 2 特征预处理API sklearn.preprocessing 为什么要进行归一化/标准化&#xff1f; 特征的单…

学习笔记052——Spring Boot 自定义 Starter

文章目录 Spring Boot 自定义 Starter1、自定义一个要装载的项目2、创建属性读取类 ServiceProperties3、创建 Service4、创建自动配置类 AutoConfigration5、创建 spring 工程文件6、将项目打成 jar 包7、jar 打包到本地仓库8、配置application.yml Spring Boot 自定义 Starte…

重学设计模式-建造者模式

本文介绍一下建造者模式&#xff0c;相对于工厂模式来说&#xff0c;建造者模式更为简单&#xff0c;且用的更少 定义 建造者模式是一种创建型设计模式&#xff0c;它使用多个简单的对象一步一步构建成一个复杂的对象。这种模式的主要目的是将一个复杂对象的构建过程与其表示…

复现SMPLify-X: Ubuntu22.04, Cuda-11.3, GPU=3090Ti

Env: 3090Ti CUDA 最低支持版本需要>cuda-11.1 Ubuntu 22.04 Installation: Installing CUDA11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run …

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年&#xff0c;OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是&#xff0c;在AI驱动的…

JAVA |日常开发中读写XML详解

JAVA &#xff5c;日常开发中读写XML详解 前言一、XML 简介二、在 Java 中读取 XML2.1 使用 DOM&#xff08;Document Object Model&#xff09;方式读取 XML2.2 使用 SAX&#xff08;Simple API for XML&#xff09;方式读取 XML 三、在 Java 中写入 XML3.1 使用 DOM 方式写入…

GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集

2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集&#xff0c;目的评估视觉-语言模型&#xff08;VLM&#xff09;在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白&#xff0c;提供了超过10,000个经过人工验证的指…

南昌榉之乡托养机构解读:自闭症与看电视并无必然联系

在探讨自闭症的成因时&#xff0c;有人会问&#xff1a;自闭症是多看电视引起的吗&#xff1f;今天&#xff0c;就让我们来看看南昌榉之乡托养机构对此有何见解。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校&#xff0c;一直致力于为大龄自闭症患者提供专业的支持…

LabVIEW MathScript工具包对运行速度的影响及优化方法

LabVIEW 的 MathScript 工具包 在运行时可能会影响程序的运行速度&#xff0c;主要是由于以下几个原因&#xff1a; 1. 解释型语言执行方式 MathScript 使用的是类似于 MATLAB 的解释型语言&#xff0c;这意味着它不像编译型语言&#xff08;如 C、C 或 LabVIEW 本身的 VI&…

基于eFramework车控车设中间件介绍

车设的发展&#xff0c;起源于汽车工业萌芽之初&#xff0c;经历了机械式操作的原始粗犷&#xff0c;到电子式调控技术的巨大飞跃&#xff0c;到如今智能化座舱普及&#xff0c;远程车控已然成为汽车标配&#xff0c;车设功能选项也呈现出爆发式增长&#xff0c;渐趋多元繁杂。…