优选算法专题7:分治
分治目录分治试题1颜色分类算法原理代码编写试题2排序数组快排算法原理代码编写试题3数组中的第K个最大元素算法原理代码编写试题4最小的k个数算法原理代码编写试题5排序数组归并算法原理代码编写试题6数组中的逆序对算法原理代码编写试题7计算右侧小于当前元素的个数算法原理代码编写试题8翻转对算法原理代码编写试题1颜色分类算法原理分治分而治之解法三指针代码编写个人版本class Solution { public: void sortColors(vectorint 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]); } } } };标准版本class Solution { public: void sortColors(vectorint 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] 1) i; else swap(nums[--right],nums[i]); } } };试题2排序数组快排算法原理解法快速排序代码编写class Solution { public: vectorint sortArray(vectorint nums) { srand(time(NULL)); qsort(nums,0,nums.size() - 1); return nums; } void qsort(vectorint nums,int l,int r) { if(l r) { return; } //数组分成三块 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]); } } //[1,left][left 1,right - 1][right,r] qsort(nums,l,left); qsort(nums,right,r); } int getRandom(vectorint nums,int left,int right) { int r rand(); return nums[r % (right - left 1) left]; } };试题3数组中的第K个最大元素算法原理解法一堆排序O(NlogN)解法二快速选择算法O(N)代码编写class Solution { public: int findKthLargest(vectorint nums, int k) { srand(time(NULL)); return qsort(nums,0,nums.size() - 1,k); } int qsort(vectorint nums,int l,int r,int k) { if(l r) { return nums[l]; } //1. 随机选择基准元素 int key getRandom(nums,l,r); //2. 根据基准元素将数组分三块 int left l - 1,right r 1,i l; while(i right) { if(nums[i] key) { swap(nums[left],nums[i]); } else if(nums[i] key) { i; } else { swap(nums[--right],nums[i]); } } //3. 分情况讨论 int c r - right 1; int b ( right - 1 ) - ( left 1 ) 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(vectorint nums,int left,int right) { return nums[rand() % (right - left 1) left]; } };试题4最小的k个数算法原理解法一排序O(NlogN)解法二大根堆O(NlogK)解法三快速选择算法O(N)随机选择基准元素数组分三块代码编写class Solution { public: vectorint inventoryManagement(vectorint nums, int k) { srand(time(NULL)); qsort(nums, 0, nums.size() - 1, k); return {nums.begin(), nums.begin() k}; } void qsort(vectorint nums, int l,int r,int k) { if(l r) { return; } //1. 随机选择一个基准元素 int key getRandom(nums, l, r); //2.数组分三块 int left l - 1,right r 1,i l; 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][left1,right-1][right,r] int a left - l 1; int b right - left - 1; if(a k) { qsort(nums, l, left, k); } else if(a b k) { return; } else { qsort(nums, right, r, k - a - b); } } int getRandom(vectorint nums, int l,int r) { return nums[rand() % (r - l 1) l]; } };试题5排序数组归并算法原理代码编写class Solution { vectorint tmp; public: vectorint sortArray(vectorint nums) { tmp.resize(nums.size()); mergeSort(nums, 0, nums.size() - 1); return nums; } void mergeSort(vectorint nums, int left, int right) { if(left right) { return; } //1. 选择中间点划分区间 int mid (left right) 1; //[left, mid] [mid 1, right] //2. 排序左右区间 mergeSort(nums, left, mid); mergeSort(nums, mid 1, right); //3. 合并两个有序数组 int cur1 left,cur2 mid 1, i 0; while(cur1 mid cur2 right) { tmp[i] nums[cur1] nums[cur2] ? nums[cur1] : 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]; } } };试题6数组中的逆序对算法原理解法一暴力枚举两层for循环解法二归并排序代码编写class Solution { int tmp[50010]; public: int reversePairs(vectorint nums) { return mergeSort(nums, 0, nums.size() - 1); } int mergeSort(vectorint nums, int left, int right) { if(left right) { return 0; } int ret 0; //1. 找中间点将数组分成两份 int mid (left right) 1; //[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]; } //5. 还原 for(int j left; j right; j) { nums[j] tmp[j - left]; } return ret; } };试题7计算右侧小于当前元素的个数算法原理代码编写class Solution { vectorint ret; vectorint index; int tmpNums[500010]; int tmpIndex[500010]; public: vectorint countSmaller(vectorint nums) { int n nums.size(); ret.resize(n); index.resize(n); //初始化index数组 for(int i 0; i n; i) { index[i] i; } mergeSort(nums, 0, n - 1); return ret; } void mergeSort(vectorint nums, int left, int right) { if(left right) { return; } //1. 根据中间元素划分区间 int mid (right left) 1; //[left, mid][mid 1, right] //2. 先处理左右两部分 mergeSort(nums, left, mid); mergeSort(nums, mid 1, right); //3. 处理一左一右 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]; } } //4. 处理剩下排序 while(cur1 mid) { tmpNums[i] nums[cur1]; tmpIndex[i] index[cur1]; } while(cur2 right) { tmpNums[i] nums[cur2]; tmpIndex[i] index[cur2]; } //5. 还原 for(int j left; j right; j) { nums[j] tmpNums[j - left]; index[j] tmpIndex[j - left]; } } };试题8翻转对算法原理解法一暴力枚举解法二分治代码编写降序策略class Solution { int tmp[50010]; public: int reversePairs(vectorint nums) { return mergeSort(nums, 0, nums.size() - 1); } int mergeSort(vectorint nums, int left, int right) { if(left right) { return 0; } int ret 0; //1. 找中间点划分区间 int mid (left right) 1; //2. 计算左右两侧翻转对 ret mergeSort(nums, left, mid); ret mergeSort(nums,mid 1, right); //3. 计算一左一右翻转对数量 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 j left; j right; j) { nums[j] tmp[j]; } return ret; } };升序策略class Solution { int tmp[50010]; public: int reversePairs(vectorint nums) { return mergeSort(nums, 0, nums.size() - 1); } int mergeSort(vectorint nums, int left, int right) { if(left right) { return 0; } int ret 0; //1. 找中间点划分区间 int mid (left right) 1; //2. 计算左右两侧翻转对 ret mergeSort(nums, left, mid); ret mergeSort(nums,mid 1, right); //3. 计算一左一右翻转对数量 int cur1 left, cur2 mid 1, i left; while(cur2 right) { while(cur1 mid nums[cur2] nums[cur1] / 2.0) { cur1; } if(cur1 mid) { break; } ret mid - cur1 1; cur2; } //4. 合并两个有序数组 cur1 left, cur2 mid 1; while(cur1 mid cur2 right) { tmp[i] nums[cur1] nums[cur2] ? nums[cur1] : nums[cur2]; } while(cur1 mid) { tmp[i] nums[cur1]; } while(cur2 right) { tmp[i] nums[cur2]; } //5. 还原 for(int j left; j right; j) { nums[j] tmp[j]; } return ret; } };

相关新闻

openclaw(小龙虾)

openclaw(小龙虾)

openclaw(小龙虾) 一、什么是openclaw openclaw是一个可以执行具体任务的AI智能体,让AI不仅仅停留在问答阶段,能真正帮助我们处理一些事情。 注意:小龙虾存在安全风险,请使用私人电脑进行操作。 需要nodejs…

2026/7/18 5:54:12 阅读更多 →
PM项目管理-权利利益模型

PM项目管理-权利利益模型

2026/7/18 5:54:12 阅读更多 →
vivado报错及解决【十】

vivado报错及解决【十】

ERROR: [Synth 8-1766] cannot open include file include.v这个错误是我们在引用类似以下的参数文件时,vivado系统找不到文件导致的。include "params.v"AMD官方的解决方案如下:AMD官方论坛提供了两种解决方案:1.将include.v文件设…

2026/7/18 5:54:12 阅读更多 →

最新新闻

PHP开发者必备资源与实战技巧全指南

PHP开发者必备资源与实战技巧全指南

1. PHP开发者资源全景指南作为一名深耕PHP领域多年的开发者,我深知优质资源对技术成长的关键作用。今天这份清单不同于常见的"Top 10资源"盘点,而是基于个人实践验证过的资源矩阵,涵盖从语言基础到架构设计的全链路工具链。这些资源…

2026/7/18 6:41:35 阅读更多 →
STM32定时器中断原理与实现教程

STM32定时器中断原理与实现教程

1. STM32定时器中断基础概念在嵌入式系统开发中,定时器中断是最基础也最重要的功能之一。STM32系列单片机提供了丰富的定时器资源,其中TIM2作为通用定时器,非常适合初学者入门学习。定时器中断的核心原理是通过硬件计数器实现精准的时间控制。…

2026/7/18 6:41:35 阅读更多 →
技术深度解析:PaddleOCR-VL-1.6-GGUF - 文档智能解析的最佳实践

技术深度解析:PaddleOCR-VL-1.6-GGUF - 文档智能解析的最佳实践

技术深度解析:PaddleOCR-VL-1.6-GGUF - 文档智能解析的最佳实践 【免费下载链接】PaddleOCR-VL-1.6-GGUF 项目地址: https://ai.gitcode.com/paddlepaddle/PaddleOCR-VL-1.6-GGUF 在当今数字化转型的浪潮中,文档智能解析技术已成为企业自动化流程…

2026/7/18 6:41:35 阅读更多 →
Video-Use:当AI代理学会“阅读“而非“观看“视频时,编辑范式发生了怎样的革命?

Video-Use:当AI代理学会“阅读“而非“观看“视频时,编辑范式发生了怎样的革命?

Video-Use:当AI代理学会"阅读"而非"观看"视频时,编辑范式发生了怎样的革命? 【免费下载链接】video-use Edit videos with coding agents 项目地址: https://gitcode.com/GitHub_Trending/vid/video-use 在传统视…

2026/7/18 6:41:35 阅读更多 →
如何利用AI艺术工具打造创意作品:Magenta完整实践指南

如何利用AI艺术工具打造创意作品:Magenta完整实践指南

如何利用AI艺术工具打造创意作品:Magenta完整实践指南 【免费下载链接】magenta Magenta: Music and Art Generation with Machine Intelligence 项目地址: https://gitcode.com/gh_mirrors/ma/magenta Magenta是一个由Google Brain团队发起的开源研究项目&a…

2026/7/18 6:41:35 阅读更多 →
开源六轴机械臂与AI集成实战:从ROS 2驱动到LeRobot智能抓取

开源六轴机械臂与AI集成实战:从ROS 2驱动到LeRobot智能抓取

1. 项目概述:当开源硬件遇上AI,一个机器人手臂的“开箱即用”之旅最近在捣鼓机器人项目,发现了一个挺有意思的套件:Waveshare的SO-ARM100/101六轴机械臂。这玩意儿最吸引我的地方,是它直接和Hugging Face的LeRobot项目…

2026/7/18 6:40:35 阅读更多 →

日新闻

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:38 阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:38 阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:38 阅读更多 →

周新闻

月新闻