【优选算法】分治

news2025/6/9 8:05:44

一:颜色分类

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

二:排序数组

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        srand(time(nullptr));
        qsort(nums, 0, nums.size()-1);
        return nums;
    }
    void qsort(vector<int>& nums, int left, int right)
    {
        // 快速排序——三区间[<key][=key][>key]
        if(left >= right) return;
        // 选择随机数 Key
        int key = GetRand(nums, left, right);
        // 三指针排法
        int i = left, l = left-1, r = right+1;
        while(i < r)
        {
            if(nums[i] < key) swap(nums[++l], nums[i++]);
            else if(nums[i] > key) swap(nums[--r], nums[i]);
            else i++;
        } 
        // // 开始往下快排
        // [left, l][l+1, r-1][r, right]
        qsort(nums, left, l);
        qsort(nums, r, right);
    }
    int GetRand(vector<int>& nums, int left, int right)
    {
        int r = rand();
        return nums[r%(right-left+1)+left];
    }
};

三:数组中的第K个最大元素

 

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

    void quickSort(vector<int>& nums, int left, int right)
    {
        if(left > right)
            return;
        // 随机数选key
        int key = GetRand(nums, left, right);
        // 三指针操作法
        // [<key][=key][>key]
        int l = left-1, i = left, r = right+1;
        while(i < r)
        {
            if(nums[i] < key)
                swap(nums[++l], nums[i++]);
            else if(nums[i] > key)
                swap(nums[--r], nums[i]);
            else
                i++;
        }
        // [left, l][l+1, r-1][r, right]
        quickSort(nums, left, l);
        quickSort(nums, r, right);
    }
public:
    int findKthLargest(vector<int>& nums, int k) {
        srand(time(0));
        quickSort(nums, 0, nums.size()-1);
        return nums[nums.size() - k];
    }
};

四:库存管理III

class Solution {
private:
    int GetRand(vector<int>& nums, int left, int right)
    {
        int r = rand();
        return nums[r%(right-left+1) + left];
    }
    void quickSort(vector<int>& nums, int left, int right)
    {
        if(left > right)
            return;
        // 获取随机数
        int key = GetRand(nums, left, right);
        // 三指针法
        int i = left, l = left-1, r = right+1;
        while(i < r)
        {
            if(nums[i] > key)
                swap(nums[--r], nums[i]);
            else if(nums[i] < key)
                swap(nums[++l], nums[i++]);
            else
                i++;
        }
        // []][][]
        quickSort(nums, left, l);
        quickSort(nums, r, right);
    }
public:
    vector<int> inventoryManagement(vector<int>& stock, int cnt) {
        srand(time(0));
        quickSort(stock, 0, stock.size()-1);
        vector<int> ret(stock.begin(), stock.begin() + cnt);
        return ret;
    }
};

五:交易逆序对的总数

 

class Solution {
    int tmp[50010];
private:
    int mergeSort(vector<int>& nums, int left, int right)
    {
        if(left >= right)
            return 0;
        // 找中间点
        int mid = (left+right)>>1;
        int ret = 0;    // 要返回的结果
        // [left, mid][mid+1, right]

        // 2. 左边的个数 + 排序 +  右边的个数 + 排序
        ret += mergeSort(nums, left, mid);
        ret += mergeSort(nums, mid + 1, right);

        // 3. 一左一右的个数
        int cur1 = left, cur2 = mid + 1, i = 0;
        while(cur1 <= mid && cur2 <= right)
        {
            if(nums[cur1] <= nums[cur2])
                tmp[i++] = nums[cur1++];
            else
            {
                ret += (mid - cur1 + 1);
                tmp[i++] = nums[cur2++];
            }
        }

        // 4. 处理一下排序
        while(cur1 <= mid) tmp[i++] = nums[cur1++];
        while(cur2 <= right) tmp[i++] = nums[cur2++];
        for(int i = left; i <= right; i++)
            nums[i] = tmp[i-left];
        return ret;
    }
public:
    int reversePairs(vector<int>& record) {
        return mergeSort(record, 0, record.size()-1);
    }
};

六:计算右侧小于当前元素的个数

 

class Solution {
    vector<int> ret;
    vector<int> index;  // 记录 nums 下当前元素的原始下标
    int tmpNums[50010];
    int tmpIndex[50010];    
private:
    void mergeSort(vector<int>& nums, int left, int right)
    {
        if(left >= right)
            return ;
        int mid = (left + right) >> 1;
        // [left, mid][mid+1, right]
        
        // 1. 先处理 左右两部分
        mergeSort(nums, left, mid);
        mergeSort(nums, mid + 1, right);

        // 2. 处理一左一右的情况
        int cur1 = left, cur2 = mid + 1, i = 0;
        while(cur1 <= mid && cur2 <= right)
        {
            if(nums[cur1] <= nums[cur2])
            {
                tmpNums[i] = nums[cur2];
                tmpIndex[i++] = index[cur2++];
            }
            else
            {
                ret[index[cur1]] = right-cur2 + 1;
                tmpNums[i] = nums[cur1];
                tmpIndex[i++] = index[cur1++];
            }
        }
        
        // 3. 处理剩下的排序
        while(cur1 <= mid)
        {
            tmpNums[i] = nums[cur1];
            tmpIndex[i++] = index[cur1++];
        }
        while(cur2 <= right)
        {
            tmpNums[i] = nums[cur2++];
            tmpIndex[i++] = index[cur2++];
        }
        for(int i = left; i <= right; i++)
        {
            nums[i] = tmpNums[i-left];
            index[i] = tmpIndex[i-left];
        }
    }
public:
    vector<int> countSmaller(vector<int>& nums) {
        int n = nums.size();
        ret.resize(n);

        // 初始化 index 按钮
        for(int i = 0; i < n; i++)
        {
            index[i] = i;
        }
        mergeSort(nums, 0, n-1);
        return ret;
    }
};

七:翻转对

 

class Solution {
    int tmp[50010];
    int mergeSort(vector<int>& nums, int left, int right)
    {
        if(left >= right)
            return 0;
        
        //1
        int mid = (left + right)>>1;
        // [left, mid][mid+1, right]
        int ret = 0;
        ret += mergeSort(nums, left, mid);
        ret += mergeSort(nums, mid + 1, right);

        // 2. 
        int cur1 = left, cur2 = mid +1, i = left;
        while(cur1 <= mid)  // 降序的情况
        {
            while(cur2 <= right && nums[cur2] >= nums[cur1]/2.0)
                cur2++;
            if(cur2 > right)
                break;
            ret += right - cur2 + 1;
            cur1++;
        }

        // 4. 
        cur1 = left, cur2 = mid+1;
        while(cur1 <= mid && cur2 <= right)
            tmp[i++] = nums[cur1]<nums[cur2]? nums[cur2++] : nums[cur1++];
        while(cur1 <= mid)
            tmp[i++] = nums[cur1++];
        while(cur2 <= right)
            tmp[i++] = nums[cur2++];
        
        // 5
        for(int i = left; i <= right; i++)
            nums[i] = tmp[i];
        
        // 6
        return ret;
    }
public:
    int reversePairs(vector<int>& nums) {
        return mergeSort(nums, 0, nums.size()-1);
    }
};

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

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

相关文章

【图片识别改名】如何批量将图片按图片上文字重命名?自动批量识别图片文字并命名,基于图片文字内容改名,WPF和京东ocr识别的解决方案

应用场景 在日常工作和生活中&#xff0c;我们经常会遇到需要对大量图片进行重命名的情况。例如&#xff0c;设计师可能需要根据图片内容为设计素材命名&#xff0c;文档管理人员可能需要根据扫描文档中的文字对图片进行分类命名。传统的手动重命名方式效率低下且容易出错&…

RabbitMQ 的高可用性

RabbitMQ 是比较有代表性的&#xff0c;因为是基于主从&#xff08;非分布式&#xff09;做高可用的RabbitMQ 有三种模式&#xff1a;单机模式、普通集群模式、镜像集群模式。 单机模式 单机模式,生产几乎不用。 普通集群模式&#xff08;无高可用性&#xff09; 普通集群模…

AI架构师修炼之道

1 AI时代的架构革命 与传统软件开发和软件架构师相比&#xff0c;AI架构师面临着三重范式转换&#xff1a; 1.1 技术维度&#xff0c;需处理异构算力调度与模型生命周期管理的复杂性&#xff1b; 1.2 系统维度&#xff0c;需平衡实时性与资源约束的矛盾&#xff1b; 1.3 价…

iview组件库:当后台返回到的数据与使用官网组件指定的字段不匹配时,进行修改某个属性名再将response数据渲染到页面上的处理

1、需求导入 当存在前端需要的数据的字段渲染到表格或者是一些公共的表格组件展示数据时的某个字段名与后台返回的字段不一致时&#xff0c;那么需要前端进行稍加处理&#xff0c;而不能直接this.list res.data;这样数据是渲染不出来的。 2、后台返回的数据类型 Datalist(pn) …

服务器 | Centos 9 系统中,如何部署SpringBoot后端项目?

系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 虚拟机 | Ubuntu图形化系统&#xff1a; open-vm-tools安装失败以及实现文件拖放 虚拟机 | Ubuntu操作系统&#xff1a;su和sudo理解及如何处理忘记root密码 文章目录 系列文章目录前言一、环境介绍二、 使用syst…

(2025)Windows修改JupyterNotebook的字体,使用JetBrains Mono

(JetBrains Mono字体未下载就配置,这种情况我不知道能不能行,没做过实验,因为我电脑已经下载了,不可能删了那么多字体做实验,我的建议是下载JetBrains Mono字体,当你使用VsCode配置里面的JetBrains字体也很有用) 首先参考该文章下载字体到电脑上 VSCode 修改字体为JetBrains …

小番茄C盘清理:专业高效的电脑磁盘清理工具

在使用电脑的过程中&#xff0c;我们常常会遇到系统盘空间不足、磁盘碎片过多、垃圾文件堆积等问题&#xff0c;这些问题不仅会导致电脑运行缓慢&#xff0c;还可能引发系统崩溃。为了解决这些问题&#xff0c;小番茄C盘清理应运而生。它是一款专业的C盘清理软件&#xff0c;能…

AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法

目录 软件架构 关键知识点 第一:PDUR的缓存作用 第二:CANTP的组包拆包功能 第三:流控帧的意义 配置过程 步骤0:ECUC模块中PDU创建 步骤1:SoAD模块维持不变 步骤2:DoIP模块为Gateway功能添加Connection ​步骤3:DoIP模块为Gateway新增LA/TA/SA ​步骤4:PDUR模…

【MySQL系列】MySQL 导出表数据到文件

博客目录 一、使用 SELECT INTO OUTFILE 语句基本语法参数详解注意事项实际示例 二、使用 mysqldump 工具基本语法常用选项实际示例 三、使用 MySQL Workbench 导出导出步骤高级选项 四、其他导出方法1. 使用 mysql 命令行客户端2. 使用 LOAD DATA INFILE 的逆向操作3. 使用编程…

vue3:十五、管理员管理-页面搭建

一、页面效果 实现管理员页面,完成管理员对应角色的中文名称显示,实现搜索栏,表格基本增删改查,分页等功能 二、修改问题 1、修改搜索框传递参数问题 (1)问题图示 如下图,之前搜索后,传递的数据不直接是一个value值,而是如下图的格式 查询可知这里传递的数据定义的是…

基于51单片机的红外防盗及万年历仿真

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能&#xff1a; &#xff08;1&#xff09;实时显示年、月、日、时、分、秒、星期信息&#xff1b; &#xff08;2&#xff09;红外传感器&#xff08;仿真中用按键模拟&#xff09;检测是否有…

【飞腾AI加固服务器】全国产化飞腾+昇腾310+PCIe Switch的AI大模型服务器解决方案

以下是全国产化飞腾AI加固服务器采用飞腾昇腾PCIe Switch解决方案&#xff1a; &#x1f5a5;️ 一、硬件架构亮点 ‌国产算力双擎‌ ‌飞腾处理器‌&#xff1a;搭载飞腾FT2000/64核服务器级CPU&#xff08;主频1.8-2.2GHz&#xff09;&#xff0c;支持高并发任务与复杂计算&a…

应用层协议:HTTPS

目录 HTTPS&#xff1a;超文本传输安全协议 1、概念 2、通信过程及关键技术 2.1 通信过程 1> TLS握手协商&#xff08;建立安全通道&#xff09; 2> 加密数据传输 2.2 关键技术 1> 对称加密算法 2> 非对称加密 3> 对称加密和非对称加密组合 4> 数…

【ArcGIS技巧】—村庄规划规划用地规划状态字段生成工具

"国土空间规划后续也是走向数据治理&#xff0c;数据建库已经是涉及到城市规划、建筑、市政、农业、地理信息、测绘等等方方面面。不得不说以后数据库建设跟维护&#xff0c;是很多专业的必修课。小编就湖南省的村庄规划建库过程中规划用地用海中规划状态字段写了个小工具…

【PCIe总线】-- inbound、outbound配置

PCI、PCIe相关知识整理汇总 【PCIe总线】 -- PCI、PCIe相关实现 由之前的PCIe基础知识可知&#xff0c;pcie的组成有&#xff1a;RC&#xff08;根节点&#xff09;、siwtch&#xff08;pcie桥&#xff09;、EP&#xff08;设备&#xff09;。 RC和EP&#xff0c;以及EP和EP能…

分布式锁实战:Redisson vs. Redis 原生指令的性能对比

分布式锁实战&#xff1a;Redisson vs. Redis 原生指令的性能对比 引言 在DIY主题模板系统中&#xff0c;用户可自定义聊天室的背景、图标、动画等元素。当多个运营人员或用户同时修改同一模板时&#xff0c;若没有锁机制&#xff0c;可能出现“甲修改了背景色&#xff0c;乙…

react+taro 开发第五个小程序,解决拼音的学习

1.找一个文件夹 cmd 2.taro init 3.vscode 找开该文件夹cd help-letters 如&#xff1a;我的是(base) PS D:\react\help-letters> pnpm install 4.先编译一下吧。看下开发者工具什么反应。 pnpm dev:weapp 5.开始规则。我用cursor就是不成功。是不是要在这边差不多了&…

kafka(windows)

目录 介绍 下载 配置 测试 介绍 Kafka是一个分布式流媒体平台&#xff0c;类似于消息队列或企业信息传递系统。 下载 Kafka对于Zookeeper是强依赖&#xff0c;所以安装Kafka之前必须先安装zookeeper 官网&#xff1a;Apache Kafka 下载此安装包并解压 配置 新建log…

基于安卓的文件管理器程序开发研究源码数据库文档

摘 要 伴随着现代科技的发展潮流&#xff0c;移动互联网技术快速发展&#xff0c;各种基于通信技术的移动终端设备做的也越来越好了&#xff0c;现代智能手机大量的进入到了我们的生活中。电子产品的各种软硬技术技术的发展&#xff0c;操作系统的不断更新换代&#xff0c;谷歌…

EMC VNXe 存储系统日志收集方法

写在前面 有朋友找来看看VNXe的故障&#xff0c;这种问题总是要收集日志&#xff0c;顺便这里也分享给大家。 注意&#xff0c;VNXe和VNX 属于完全不同的产品&#xff0c;不要看名字很类似&#xff0c;操作系统已经完全重构了&#xff0c;如果说是否有联系&#xff0c;大概就…