AcWing 53. 最小的k个数(堆+快速排序的轴点选择函数)

快速排序 大雪菜 基础算法(一) 1.排序 (1).快速排序 模板(快速排序算法模板 —— 模板题 AcWing 785. 快速排序): //边界问题!边界问题!边界问题! //代码1 void quick_sort(int q[],int l,in r){ if(l>=r) return; int i=l-1,j=r+1,x=q[l+r>>1]; while(i<j){ do i++; while(x>q[i]); do j++; while(x<q[j]); 阅读详情

1.基于堆的实现

创建一个最大堆,控制其最大规模为k。若堆的规模小于k则不断将数组元素压入到堆中,否则则要根据当前元素和堆顶元素的大小来判断是否进行“交换”操作(堆顶元素弹出,当前数组元素压入)。不断重复此操作就可以将原数组中所有最小的k个数全部保留到堆中了。

具体代码如下:

class Solution {
public:
    vector<int> getLeastNumbers_Solution(vector<int> input, int k) {
        priority_queue<int, vector<int>, less<int>> q;
        vector<int> ans;
        for(auto e: input){
            if(q.size() < k) q.push(e);
            else if(q.top() > e){
                q.pop();
                q.push(e);
            }
        }
        while(!q.empty()){
            ans.push_back(q.top());
            q.pop();
        }
        return vector<int> (ans.rbegin(), ans.rend());
    }
};

该算法的时间复杂度是O(nlogk),虽然略高,但是此算法既不会改变原数组,同时又很适合用于大量数据的情况。

2.基于快速排序的轴点选择函数的实现

参考我的上一篇博文AcWing 52. 数组中出现次数超过一半的数字(基于中位数和众数的线性复杂度的解法)中的第1部分。这个方法仍然要用到快速排序的轴点选择函数。我们令此函数每次都返回轴点的位置,如果这个位置恰好为k,则说明从数组开始到轴点位置的元素全都是我们要找的最小的k个数。反之则要根据轴点的位置调整数组区间大小进行进一步地划分,直至返回的轴点位置为k为止。在提取数组前k个元素后要注意进行排序。

具体代码如下:

class Solution {
public:
    int partition(vector<int> &nums, int lo, int hi){
        int i = lo, j = hi;
        while(i < j){
            while(nums[i] < nums[lo]) i++;
            while(nums[j] >= nums[lo]) j--;
            if(i < j) swap(nums[i], nums[j]);
        }
        swap(nums[i], nums[lo]);
        return i;
    }

    vector<int> getLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> ans;
        if(input.empty()) return ans;
        int lo = 0, hi = input.size() - 1;
        int index = partition(input, lo, hi);
        while(index != k - 1){
            if(index > k - 1){
                hi = index - 1;
                index = partition(input, lo, hi);
            }
            else{
                lo = index + 1;
                index = partition(input, lo, hi);
            }
        }
        for(int i = 0; i < k; i++){
            ans.push_back(input[i]);
        }
        sort(ans.begin(), ans.end());
        return ans;
    }
};

该算法的时间复杂度为O(n),相对于上一个方法要低一些,不过此算法需要改变原数组同时又不太适用于大量数据的情况。

基础算法-快速排序-C++实现 快速排序 算法基本思想和步骤——分治思想 1.确定边界点和分界点 2.调整区间 3.递归处理左右两段 题目关键点:边界的确定、区间的调整、调整后再递归 AcWing题库-785-快速排序 题目 给定你一个长度为n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。 输出格式 输出共一行,包含 n 个整数,表示排好序的数列。 数据范围 1≤n≤1000 阅读详情

相关推荐

Acwing算法基础课学习笔记

Acwing 算法基础学习笔记

togph的博客 2405

试题 算法训练 最小距离

试题 算法训练 最小距离 资源限制 时间限制:1.0s 内存限制:256.0MB   最小距离 问题描述   数轴上有n个数字,求最近的两个数,即min(abs(x-y)) 输入格式   第一行包含一个整数n。   接下来一行,表示n整数。 输出格式   一个整数表示最小距离 样例输入 6 7 3 4 11 9 17 样例输出 1 样例说明   取3和4 数据规模和约定   n<=100000   所有整数<=10^7 分析:需要先排序通过sort函数,这样就可以通过相邻的数字相减,找到最小

qq_51917627的博客 938

手把手教你用STM32F103的GPIO模拟MIPI RFFE协议(附完整代码与逻辑分析仪调试技巧)

本文详细解析了如何使用STM32F103的GPIO模拟MIPI RFFE协议,包括协议核心、硬件准备、时序模拟、寄存器操作及逻辑分析仪调试技巧。通过实战代码和波形分析,帮助工程师解决电平转换、奇校验处理等常见问题,提升通信稳定性与效率。

weixin_30292745的博客 284

快速排序中常见中轴选择方法及实现代码

一、选取最后一个元素 在我们的课本中,看到最多的就是选择第一个元素作为中轴,但是在很多书上却选择最后一个元素作为中轴。下面就让我们来一睹选取最后一个元素作为中轴的快排。 注:本文中的所有算法都采用双向扫描法,即,设两个下标i和j,i和右扫描,j向左扫描,直到i不小于j。而当下标为i的数小于中轴时,跳过并继续向右扫描,否则停止扫描,并开始j的向左扫描,相对地,当下标为j的数大于中轴时,跳过并...

810364804 1220

保姆级教程:用CameraX API快速搞定Android多摄像头切换与预览(附避坑指南)

本文提供了一份详细的CameraX API教程,帮助开发者快速实现Android多摄像头切换与预览功能。通过简化API设计和生命周期感知能力,CameraX大幅降低了开发复杂度,同时解决了多摄像头兼容性、预览优化等常见问题。文章包含完整代码示例和实战避坑指南,特别适合需要高效集成相机功能的Android开发者。

weixin_42699679的博客 166

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

算法 - 快速排序(Quick Sort)

1960年由查尔斯·安东尼·理查德·霍尔(Charles Antony Richard Hoare,缩写为C.A.R.H) 昵称为东尼·霍尔(Tony Hoare ) 执行流程: 从序列中选择一个轴点元素(pivot) 假设每次选择0位置的元素为轴点元素 利用pivot将序列分割成2个子序列 将小于pivot的元素放在pivot前面(左侧) 将大于pivot的元素放在pivot后面(右侧)...

宋卓的博客 263

Python爬虫技术:使用Playwright和Twitter API v2高效获取Twitter/X数据完全教程

遵守规则:始终遵循Twitter的使用条款和速率限制错误处理:实现完善的错误处理和重试机制数据质量:进行数据清洗和验证性能优化:使用异步处理和合理的延迟设置可维护性:模块化代码,便于维护和扩展。

2201_76125261的博客 671

快速排序中枢轴元素从首、尾、中间三元素取中间值函数的探究

这几天作快速排序时,

时空霹雳的专栏 6258

【工控基础】UVW平台踩坑

1 每个轴按顺时针或逆时针走一个距离,就是旋转。 2 图中W动,U轴V轴不动,就是X方向的平移 3 图中U轴V轴同时动,X不动,就是Y方向的平移。

songhuangong123的博客 6951

复现论文《Analysis of circulating current mechanism of Grid-forming offshore wind farm based on DRU-HVDC》

该论文研究了基于二极管整流单元(DRU)和低频交流(LFAC)输电的构网型(GFM)海上风电场并网系统中环流的产生机理。由于 DRU 不可控,系统电压与频率依赖于风力发电机(WT)的网侧变流器,当多台 WT 并联运行时,因输出电压幅值、相位、输出阻抗或频率不匹配,会产生基频环流,导致系统损耗增加与稳定性下降。论文通过理论建模与 MATLAB/Simulink 仿真,分析了四种不平衡工况下的环流机理,并指出幅值不平衡和阻抗不平衡引起无功环流,相位不平衡引起有功环流,频率不平衡则引起环流振荡,为后续环流抑制研究

huanghm88的专栏 104

快速排序学习 以数组中间值为轴

public static void main(String[] args) { int[] arrs = {15,13,17,19,6,34,9,55,9,3242,4}; quickSearch(arrs,0,arrs.length-1); for (int i : arrs) { System.out.println(i); } } private static

a1833255的博客 3969

100 道大数据开发技术原理与实战面试宝典(必过答案详细解析)I

在数字化浪潮席卷全球的今天,大数据开发工程师已成为企业数字化转型的核心力量。无论是互联网巨头的用户行为分析,还是金融机构的风险控制,亦或是智慧城市的数据中枢,都离不开大数据技术的支撑。然而,面对BAT等头部企业严格的面试要求,候选人不仅需要掌握扎实的理论基础,更需具备将技术落地的实战能力。本文基于历年高频面试题与企业真实场景需求,梳理100道必考题目,涵盖基础概念、框架原理、算法设计、性能优化等核心领域,助你构建完整的知识体系,从容应对面试挑战。

AI天才研究院 1386

ACWING53. 最小的k个数(剑指offer,快速排序)

输入n个整数,找出其中最小的k个数。 注意: 数据保证k一定小于等于输入数组的长度; 输出数组内元素请按从小到大顺序排序; 样例 输入:[1,2,3,4,5,6,7,8] , k=4 输出:[1,2,3,4] 思路: 快速排序每次可以确定一个基准点x,保证x前面的数都不大于a[x],后面的数都不小于a[x],确定了x,并且保证这个位置是k,前k个最小数就确定了。 class Solution { ...

tomjobs的博客 380

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

具身机器人和通用AI 5232

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【快速排序】快速排序/第k个数

acwing算法学习笔记 -----快速排序

青竹雾色间.的博客 1998

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

AcWing 53. 最小的k个数-java

快速排序和最大堆的时间复杂度都是 nlogn输入 n 个整数,找出其中最小的 k 个数。注意:输出数组内元素请按从小到大顺序排序; 数据范围 1≤k≤n≤1000最朴素的做法就是排序 然后输出 2、最大堆 维护一个大小为k的大根堆,将数组元素都push进堆,当堆中的数大于k时弹出堆顶元素。注意弹出堆顶的顺序是从大到小的k个数,要进行逆序操作 最大堆 把最大的数弄出去 剩下的就是最小的数 注意的是 输出是按照从大到小的顺序输出的 所以使用addFirst函数加入到list的头...

qq_41810415的博客 197

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

剑指Offer打卡day24——AcWing 53. 最小的k个数

【题目描述】 AcWing 53. 最小的k个数 作弊写法 class Solution { public List<Integer> getLeastNumbers_Solution(int [] input, int k) { Arrays.sort(input); List<Integer> list = new ArrayList<>(); for(int i = 0; i < k; i++)

JohnnyLin 163

AcWing 786 第k个数

题目描述: 给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。 输入格式 第一行包含两个整数 n 和 k。 第二行包含 n 个整数(所有整数均在1~109109范围内),表示整数数列。 输出格式 输出一个整数,表示数列的第k小数。 数据范围 1≤n≤1000001≤n≤100000, 1≤k≤n1≤k≤n 输入样例: 5 3 2 4 1 ...

昂昂累世士的博客 426

AcWing (785.快速排序)&&(786.第k个数)

1.先把模板背下来,再去慢慢理解。AcWiing 快速排序 第k个数

weixin_53009877的博客 178

AcWing 53. 最小的k个数

题目链接 题目挺简单的,我直接用了python自己带的排序功能 class Solution(object): def getLeastNumbers_Solution(self, input, k): """ :type input: list[int] :type k: int :rtype: list[int] """ #创建list保存最小值 min_list=[]

qq_53183608的博客 124

#快速排序 :快速排序、第k个数 20.09.12

快速排序 AcWing 785. 快速排序 AcWing 785. 快速排序 题目 给定你一个长度为n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。 输出格式 输出共一行,包含 n 个整数,表示排好序的数列。 数据范围 1≤n≤100000 输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5 思路 解答 #includ

仅仅是笔记。 899

acwing基础课——快速排序

acwing算法基础课二刷

qq_62417282的博客 293

2022-01-06每日刷题打卡

一、Y总视频进度 二、AcWing 785. 快速排序 (1)题目描述 给定你一个长度为 nn 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 nn。 第二行包含 nn 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。 输出格式 输出共一行,包含 nn 个整数,表示排好序的数列。 数据范围 1≤n≤1000001≤n≤100000 输入样例: 5 3 1 2 4 5

AnubisL的博客 736

AcWing 785 && AcWing 786

1.1 快速排序 AcWing 785. 快速排序 题目 给定你一个长度为n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在1~109109范围内),表示整个数列。 输出格式 输出共一行,包含 n 个整数,表示排好序的数列。 数据范围 1 ≤ n ≤ 100000 输入样式: 5 3 1 2 4 5 输出样例: 3 1 2 4 5 解题思路 快速排序(quick sort)采用的

qq_30833231的博客 261

acwing算法基础课(第一讲 基础算法)

快速排序 785. 快速排序 给定你一个长度为n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。 输出格式 输出共一行,包含 n 个整数,表示排好序的数列。 数据范围 1≤n≤100000 输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5 #include <bits/stdc++.h> using namespace

Destiny_159的博客 2019
上一篇: AcWing 52. 数组中出现次数超过一半的数字(基于中位数和众数的线性复杂度的解法)
下一篇: sklearn代码实例学习笔记-1.1.1普通最小二乘法
Zee_Chao
博客等级 码龄11年 168粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值