优选算法——分治(2):快速选择

🔥近津薪荼: 个人主页 🎬个人专栏: 《近津薪荼的算法日迹》 《Linux操作系统及网络基础知识分享》 《c++基础知识详解》 《c语言基础知识详解》 ✨不要物化,矮化,弱化,钝化自己,保持锋芒,不要停止学习 这个世界上只有两个人真正在注意着你 八岁的你,和八十岁的你, 他们此刻正在注视着你, 一个希望你 勇敢开始 ,一个希望你 不留遗憾


1.上期参考代码

cpp 复制代码
class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
    
        qsort(nums,0,nums.size()-1);
        return nums;
    }
    void qsort(vector<int>& nums,int left,int right)
    {
        if(left>=right) return;
        int key=(left+right)/2;
        int mid=nums[key];
        int l=left-1,r=right+1,i=left;//初始化三指针
        while(i<r)
        {
            if(nums[i]<mid)swap(nums[++l],nums[i++]);//维护[0,l]
            else if(nums[i]>mid)swap(nums[--r],nums[i]);//维护[r,right]
            else i++;
        }
        qsort(nums,left,l);
        qsort(nums,r,right);
    }
};

2.本期知识点导图

3.本期要讲解的题目是

数组中的第K个最大元素

要点:

  • 时间复杂度不可超过n,普通快排直接out
  • 堆排序也直接out

4.解题

4.思路

目前世界上还不存在能处理任意输入的、时间复杂度严格为 O (N) 的通用排序算法。

所以我们要就题论题,设计算法

上一期我们学了快速排序算法(三路快排),它是他通过数组分块的思想,优化了在有大量重复元素的排序情况,使得此情况下时间复杂度优于普通快排。

总结下来,

4.1三路快排的两个特点:

  • 数组分块
  • 算法性能有针对性

4.2分析现有条件

本题并没有大量的重复元素,貌似没有三路快排的用武之地。

之前dfs剪枝部分学得好的同学,看到这边可能机有点小感觉了,没错

我们就是要利用数组分块的性质来进行剪枝,来达到优化算法的目的。

如图:
在分快的数组中,我们分别计算出a块和b块的长度 ### 要找第k大的元素,可以分成3条路子

当a的长度大于等于k的时候,要找的值一定在区间r,right中。

当k大于a但是小于等于a+b的时候,一定在区间l+1,r-1中,这边直接返回key就得了。(出口)

还有一种情况,只能在c中了。

确定好在哪个区间之后,递归去找就行了。

代码逻辑

思路:利用三路快排数组分块的特点来剪枝

递归逻辑:

  • 子问题是什么:找出本区间的第k大元素
  • 子问题干什么:排序,判断第k大数在哪个区间。(剪枝)
  • 出口:在b中直接返回

5.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦
佬的支持就是我前进的最大动力 ~

期待与佬的再次相遇~

相关推荐
To_OC3 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎4 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC4 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
delishcomcn5 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹5 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试
雪碧聊技术6 小时前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
CV-Climber8 小时前
检索技术的实际应用
人工智能·算法
hhzz9 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
从零开始的代码生活_10 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法