【练习】分治--快排思想
- 🎥 个人主页:Dikz12
- 🔥个人专栏:算法(Java)
- 📕格言:吾愚多不敏,而愿加学
- 欢迎大家👍点赞✍评论⭐收藏
目录
颜色分类
题目描述
题解
代码实现
排序数组
题目描述
题解
代码实现
数组中的第k个最大元素
题目描述
题解
编辑 代码实现
库存管理III( 最小k个数)
题目描述
编辑 题解
代码实现
分治:分而治之.
颜色分类
题目描述
题解
解法:三指针(数组分三块).
代码实现
public void sortColors(int[] nums) { int i = 0, left = -1, right = nums.length; while(i排序数组
题目描述
题解
解法:快速排序(数组分三块+随机选择基准).
快排最核⼼的⼀步就是 Partition (分割数 据):将数据按照⼀个标准,分成左右两部分。 这里 不是使用的是将数组分成两部分(挖坑法、Hoare法)。 而是使⽤荷兰国旗问题的思想,将数组划分为 左 中 右 三部分:左边是⽐基准元素⼩的数据, 中间是与基准元素相同的数据,右边是⽐基准元素⼤的数据。然后再去递归的排序左边部分和右边 部分即可(可以舍去⼤量的中间部分)。 在处理数据量有很多重复的情况下,效率会⼤⼤提升!!!数组分三块,过程就跟上题一样就不在进行详述.
优化方式有:随机选择基准 和 三位取中.
代码实现
public int[] sortArray(int[] nums) { qsort(nums,0,nums.length - 1); return nums; } public void qsort(int[] nums,int l , int r) { //递归结束 if (l >= r) { return; } //数组分三块 int key = nums[new Random().nextInt(r - l + 1) + l]; int left = l - 1, i = l, right = r + 1; while(i数组分三块+优化
数组中的第k个最大元素
题目描述
题解
解法:快速选择算法(数组分三块+随机选取基准元素) 。
在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出我们要找的元素是 在「哪⼀个区间」⾥⾯。 那么我们可以直接去「相应的区间」去寻找最终结果就好了。
代码实现public int findKthLargest(int[] nums, int k) { return qsort(nums,0,nums.length-1,k); } public int qsort(int[] nums,int l ,int r, int k) { //结束条件 if (l >= r) { return nums[l]; } //1.随机选取基准 int key = nums[new Random().nextInt(r - l + 1) + l]; //2.数组分"三块" int i = l , left = l - 1, right = r + 1; while(i = k) { return qsort(nums,right,r,k); } else if (b + c >= k) { return key; } else { return qsort(nums,l,left,k - c - b); } } public void swap(int[] nums, int i , int j) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }库存管理III( 最小k个数)
题目描述
题解解法一:堆排.(大根堆)O(NlogN).
解法二:快速选择算法(数组分三块+随机选取基准元素) O(N)
在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出最⼩的 k 个数在哪 些区间⾥⾯。 那么我们可以直接去「相应的区间」继续划分数组即可。代码实现
public int[] inventoryManagement(int[] nums, int cnt) { qsort(nums,0,nums.length-1,cnt); int[] ret = new int[cnt]; for(int i = 0; i = r) { return; } //1.随机选取基准 int key = nums[new Random().nextInt(r - l + 1) + l]; //2.数组分三块 int i = l, left = l - 1,right = r + 1; while(i = k) { qsort(nums,l,left,k); } else if(a + b >= k) { return; } else { qsort(nums,right,r,k - a - b); } } public void swap(int[] nums, int i , int j) { int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!












