分治算法专题(一)——快速排序之【三路划分】

目录

1、分治算法简介

2、算法应用【leetcode】

2.1 题一:颜色分类

2.1.1 算法原理

2.2.1 算法代码

2.2 题二:排序数组——数组分三块原理

 2.2.1 算法原理

2.2.2 算法代码

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

2.3.1 算法原理

2.3.2 算法代码

2.4 题四:库存管理III(原:剑指 Offer . 最小的k个数)

2.4.1 算法原理 

2.4.2 算法代码


1、分治算法简介

分治算法——简而言之,就是分而治之。

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成的程序算法,简单问题可用二分法完成。

将一个大问题划分称为若干个子问题,再将子问题划分为若干个更小的子问题,将一个个最小的子问题依次解决后,大问题也就顺势解决了。

2、算法应用【leetcode】

2.1 题一:颜色分类

. - 力扣(LeetCode)

2.1.1 算法原理

变量设置:

  1. i:遍历数组
  2. left:指向最后一个值为0的元素
  3. right:指向第一个值为2的元素

变量区域含义:

  1. [0,left]:全部是0
  2. [left+1,i-1]:全部是1
  3. [i,right-1]:未扫描
  4. [right,n-1]:全部是2

注意:

  1. if(nums[i]==0) --> swap(++left,i++);
  2. if(nums[i]==2) --> swap(--right,i);//right-1位置的数值仍然是未知的,i不能++

2.2.1 算法代码

class Solution {public void sortColors(int[] nums) {int left = -1;int right = nums.length;for(int i = 0; i < right; i++) {if(nums[i] == 0) {swap(nums, ++left, i);}else if(nums[i] == 2) {swap(nums, --right, i);i--;}}}public void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

2.2 题二:排序数组——快排三路划分

. - 力扣(LeetCode)

 2.2.1 算法原理

本题可使用多种排序算法解决,这里演示快排的分治——数组分三块方法。

本次快排实现与以往不同的是——partition部分发生了改变:数组分三块。

  1. 选取基准值key
  2. 将数组依次分为<key、=key、>key,三部分
  3. 这样一来,确定了=key这组数据在排完序后的固定位置
  4. 数组分两块,在数据有序时快排将退化为O(N^2)
  5. 而数组分三块,在数据有序时快排将稳定为O(N)

对于基准key的选取,我们采用随机数法优化法:

  • key = nums[random.nextInt%(end-start+1)+start];//(随机数法取基准)
  • 随机数法相较于三数取中法更优

2.2.2 算法代码

class Solution {public int[] sortArray(int[] nums) {quickSort(nums);return nums;}public void quickSort(int[] nums) {quick(nums, 0, nums.length - 1);}public void quick(int[] nums, int s, int e) {if(s >= e) return;int key = nums[new Random().nextInt(e - s + 1) + s];int[] ret = partition(nums, s, e, key);quick(nums, s, ret[0]);quick(nums, ret[1], e);}//数组分三块public int[] partition(int[] nums, int l, int r, int key) {int i = l;int left = l - 1;int right = r + 1;while(i < right) {if(nums[i] < key) {swap(nums, ++left, i++);}else if(nums[i] == key) {i++;}else {swap(nums, --right, i);}}int[] ret = {left, right};return ret;}public void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

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

. - 力扣(LeetCode)

2.3.1 算法原理

top-K问题的解法有三种:

  1. 解法一:排序 --> O(N*logN)
  2. 解法二:堆 --> O(N*logK)
  3. 解法三:快速选择算法 --> O(N)(基于快速排序)

这里讲解最优的快速选择算法。

快速选择算法就是基于上题快排做出了一点小调整,对于三个区域分类讨论,选出第K个最大值。

  1. c >= k ,去[r,e]找第k大的值
  2. c+b >= k,返回key
  3. ①和②都不成立,则去[s,l]找第k-b-c大的值 

2.3.2 算法代码

class Solution {int ret;public int findKthLargest(int[] nums, int k) {return quick(nums, 0, nums.length - 1, k);}public int quick(int[] nums, int s, int e, int k) {//随机选择基准元素int key = nums[new Random().nextInt(e - s + 1) + s];//根据基准元素,使数组分三块int left = s - 1, right = e + 1, i = s;while(i < right) {if(nums[i] < key) swap(nums, ++left, i++);else if(nums[i] == key) i++;else swap(nums,--right, i);}//分类讨论//[s, left], [left + 1, right - 1], [right, e]int b = right - left - 1, c = e - right + 1;if(c >= k) {return quick(nums, right, e, k);}else if (b + c >= k) {return key;}else {return quick(nums, s, left, k - b - c);}}public void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

2.4 题四:库存管理III(原:剑指 Offer . 最小的k个数)

. - 力扣(LeetCode)

2.4.1 算法原理 

整体思想:将数组的前k个数保证为最小的k个数即可。

随机数取基准 -> 将数组划分三块 -> 如下分类讨论

  • ①:a > k,qsort(nums, s, left);
  • ②:a +b >= k,,返回
  • ③:①、②都不符合,qsort(nums, right, e, k - a - b);

2.4.2 算法代码

class Solution {public int[] inventoryManagement(int[] stock, int cnt) {qsort(stock, 0, stock.length - 1,  cnt);int[] ret = new int[cnt];for(int i = 0; i < cnt; i++) {ret[i] = stock[i];}return ret;}public void qsort(int[] stock, int s, int e, int cnt) {//随机数法取基准int key = stock[new Random().nextInt(e - s + 1) + s];//数组分三块int left  = s - 1, right = e + 1, i = s;while(i < right) {if(stock[i] < key) swap(stock, ++left, i++);else if(stock[i] == key) i++;else swap(stock, --right, i);}//分类讨论int a = left - s + 1, b = right - left - 1;if(a > cnt) {qsort(stock, s, left, cnt);}else if (a + b >= cnt) {return;}else {qsort(stock, right, e, cnt - a - b);}}public void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

3、分治——归并排序

3.1  排序数组

. - 力扣(LeetCode)

3.1.1 算法代码

对于归并排序的原理,这里就不再赘述了。

class Solution {int[] tmp;public int[] sortArray(int[] nums) {tmp = new int[nums.length];mergeSort(nums, 0, nums.length - 1);return nums;}public void mergeSort(int[] nums, int s, int e) {if(s >= e) return;//根据中间节点划分区间int mid = (s + e) / 2;//把左右区间排序mergeSort(nums, s, mid);mergeSort(nums, mid + 1, e);//合并两个有序数组merge(nums, s, mid, e);}public void merge(int[] nums, int s, int mid, int e) {int s1 = s, e1 = mid, s2 = mid + 1, e2 = e;int k = 0;while(s1 <= e1 && s2 <= e2) tmp[k++] = nums[s1] <= nums[s2] ? nums[s1++] : nums[s2++];//处理没有遍历完的数组while(s1 <= e1) tmp[k++] = nums[s1++];while(s2 <= e2) tmp[k++] = nums[s2++];for(int i = s; i <= e; i++) nums[i] = tmp[i - s]; }
}

END

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

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

相关文章

各大平台统遭入侵??区块链市场遭攻击损失近3亿!

今年&#xff0c;全球发生多起骇人听闻的勒索入侵软件攻击事件&#xff0c;黑客组织利用各种手段和技术&#xff0c;不断试图突破网络安全防线&#xff0c;窃取敏感信息、破坏系统运行&#xff0c;甚至进行勒索和敲诈&#xff0c;使得网络安全问题日益凸显其重要性和紧迫性。 S…

Mysql分组取最新一条记录

文章目录 Mysql分组取最新一条记录1. 数据准备1. 方法1&#xff1a;使用子查询获取每个组的最大时间戳&#xff0c;然后再次查询获取具体记录&#xff08;如果时间戳是唯一的&#xff09;2. 方法2&#xff1a;使用窗口函数&#xff08;MySQL 8.0&#xff09;3. 方法3&#xff1…

TikTok跨境电商营销新策略:品牌联盟与影响力经济的结合

随着TikTok成为全球化的社交和电商平台&#xff0c;也给跨境卖家提供了新的商机。境电商通过与其他知名品牌、网红或KOC建立品牌联盟&#xff0c;能够有效实现资源共享、优势互补&#xff0c;并推动市场扩张&#xff0c;带来更大的商业价值和品牌影响力。本文Nox聚星将和大家探…

鸿蒙开发协调布局CollapsibleLayout

鸿蒙开发协调布局CollapsibleLayout 首先鸿蒙我暂时没找到官方提供的协调布局&#xff0c;所以得自己自定义。 一、思路 可滚动头部、粘性头部、可滚动内容布局 可折叠区域高度可滚动头部高度-粘性头部高度 二、效果图 鸿蒙开发协调布局CollapsibleLayout 三、关键代码 //…

优思学院|如何从零开始自己学习六西格玛?

优思学院为学习六西格玛管理的学员&#xff0c;精心推荐了几本由浅入深、系统全面的书籍&#xff0c;帮助大家从入门到精通&#xff0c;逐步掌握六西格玛这一强大的管理工具。无论你是刚接触六西格玛的初学者&#xff0c;还是想在专业领域提升的高级学员&#xff0c;这几本书都…

【ARM】Trustzone和安全架构

Trustzone的基本概念&背景和历史 什么是Trustzone&#xff1f; 什么是TEE&#xff1f; Trustzone是一个技术&#xff0c;是一个技术的设计&#xff0c;一个安全架构&#xff0c;既不是软件也不是硬件。 TEE (Trusted Execution Environment) 可信执行环境。就是依托Trust…

速响低代码平台:升级营销管理系统,开启高效无忧新体验!

当前日新月异的商业环境&#xff0c;企业面临着前所未有的挑战与机遇。随着市场竞争的日益加剧和企业业务的不断拓展&#xff0c;传统的营销方式和管理手段逐渐显露出其局限性&#xff0c;难以适应快速变化的市场需求。 数据收集难&#xff1a;传统的营销管理缺乏对客户数据的收…

战神诸神黄昏9月19日登录PC端! 手机怎么玩战神诸神黄昏

9月19日&#xff0c;《战神&#xff1a;诸神黄昏》正式登录PC端&#xff0c;这是一部动作冒险游戏。要是你想随时随地在手机或平板上也能玩《战神&#xff1a;诸神黄昏》&#xff0c;可以使用网易GameViewer远程帮你实现。 网易GameViewer远程作为一款专为游戏玩家打造的远程软…

轻松让U盘数据恢复的教程:一步步指导,快速找回丢失文件

在日常使用U盘的过程中&#xff0c;我们可能会不小心删除或格式化了一些重要文件&#xff0c;导致数据丢失。面对这种情况&#xff0c;很多人可能会感到焦虑和无助。但其实&#xff0c;只要掌握了正确的方法&#xff0c;U盘数据的恢复并不复杂。本文将为大家提供一份详细的教程…

LIN总线CAPL函数——校验和段(Checksum)测试(linGetChecksum)

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

57.【C语言】字符函数和字符串函数(strerror函数)

11.strerror函数 *简单使用 strerror string error cpuscplus的介绍 点我跳转 翻译: 函数 strerror char * strerror ( int errnum ); 得到指向错误信息字符串(简称错误码)的指针 解释errnum的值,产生一条描述错误情况的信息的字符串,就像被库函数设置为errno一样 这个返回的…

【新手上路】衡石分析平台使用手册-系统管理员手册

用户管理​ 用户管理页面可以创建管理用户、对用户进行分组管理、组织架构管理及用户属性的维护和管理。下面详细介绍用户管理相关功能。 用户管理​ 用户管理子页面展示了当前系统中所有用户的信息&#xff0c;可以添加新用户&#xff0c;查看、编辑已有用户&#xff0c;可…

解锁社交业务增长与合规“秘笈”,泛娱乐行业沙龙杭州站亮点一览!

在全球数字化浪潮的推动下&#xff0c;泛娱乐行业正迎来广阔的发展空间&#xff0c;与此同时&#xff0c;社交产品监管日益规范&#xff0c;海外市场机遇与挑战并存&#xff0c;游戏行业增速放缓等情况也不容忽视。如何在合规前提下&#xff0c;探求新的增长点成为从业者共同关…

CAN_FD和CAN2.0的不同点——深入浅出理解CAN协议(二)

本系列是在同公司硬件设计和验证同事&#xff0c;1、在完成了CANFD硬件接口IP开发 2、熟悉ISO-11898系列、ISO16845、CAN2.0协议、CANFD协议等以及大量学习资料 3、深入研究其他家CANFD IP&#xff08;NXP、BOSCH&#xff09;4、独立开发了对应底层驱动 5、通过CANoe和周立功CA…

Java Web服务运行一段时间后出现cpu升高导致的性能下降问题排查

背景 有个web服务&#xff0c;运行一段时间后&#xff0c;出现cpu逐渐占用高&#xff0c;服务处理请求整体性能下降问题。 异常情况时&#xff0c; 同时jvm的cpu上涨 最终表现为&#xff0c;处理内部逻辑执行耗时变高。 排查原因 原来服务的jvm启动参数带了 -XX:-TieredCom…

rocky9虚拟机配置双网卡的详细过程

编辑虚拟机配置->添加->选择网络适配器->确认->打开虚拟机 1.ip add查看第二个网卡的名称&#xff0c;我这里是ens36 2.cd到网卡的配置文件目录 cd /etc/NetworkManager/system-connections/ ls3.复制一份网卡的配置文件并改名为ens36.nmconnection(根据自己的第…

5V全桥驱动芯片单通道可替代型号LG9110S,应用于牙刷,电子锁,共享单车锁等产品中具有过温保护功能

芯片描述&#xff1a; GC9110 是一款低压 5V 全桥驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。GC9110 能提供高达 1.3A 的持续输出电流。可以工作在 2~6V 的电源电压上。GC9110 具有 PWM&#xff08;…

香橙派zero2w上手——环境配置添加OLED小屏幕

0 硬件参数 origin pi zero2W 硬件参数 CPU全志 H618 四核 64 位 1.5GHz Cortex-A53 处理器GPUMali G31 MP2&#xff0c;支持OpenGL ES 1.0/2.0/3.2&#xff0c;OpenCL 2.0&#xff0c;Vulkan 1.1内存LPDDR4:1GB/1.5GB/2GB/4GB (可选)存储SPI Flash: 16MBWiFi蓝牙WiFi蓝牙二合…

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行&#xff1b;当前是秒级时间戳&#xff0c;如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

办公生产力工具 职场打工人早下班宝藏神器推荐

当你外出时&#xff0c;电脑不在身边&#xff0c;但需要处理文件怎么办&#xff1f;这时&#xff0c;你需要一个提高办公生产力工具。网易GameViewer远程控制软件可以帮助你轻松实现这一目标&#xff0c;简直是职场打工人早下班宝藏神器。 GameViewer远程可以一键直连无需复杂配…