[Leetcode][Medium]-面试题 17.14.最小k个数-TOP K问题-快排/大根堆

news2024/11/24 19:42:15

一、题目描述

原题地址

二、整体思路

        (1)、快排

                数组中最小的k个数就是说把数组升序排列,求[0,k-1]区间上的数。

                快排可以得到一个元素在升序排序的数组中的正确位置。在这个位置的左边区间[l,l2-1]上的元素都比它小,在这个位置的右边区间[r2,r]上的元素都比它大。

                那么当k<=l2-1时,说明还需要对左边区间[l,l2-1]进行快排,当k>=r2时,说明还需要对右边区间[r2,r]进行快排,当k在[l2,r2-1]时,说明arr[k]已经被放置至数组升序排序的正确位置,那么[0,k-1]上的元素就是题目中要求的k个数。

        (2)、大根堆 

                把数组[0,k-1]区间上的数化为大根堆。然后遍历剩下数组的部分。若遍历到的元素小于堆顶,则替换堆顶。重复此步骤最终可以得到数组中最小的K个数组成的小根堆,堆顶为数组所有元素中第K小的元素。

三、代码

//快排
class Solution {
    public int[] smallestK(int[] arr, int k) {
        if(arr.length==0 || k==0) return new int[0];
        int[] arr2=new int[k];
        Random random=new Random();
        quicksort(arr,0,arr.length-1,k,random);
        for(int i2=0;i2<=k-1;i2++){
            arr2[i2]=arr[i2];
        }
        return arr2;
    }
    private void quicksort(int[] arr,int l,int r,int k,Random random){
        if(l>=r) return;
        //arr[l]与数组中元素随机交换,避免快速排序退化导致性能下降
        int p=random.nextInt(r-l+1)+l;
        int temp=arr[l];
        arr[l]=arr[p];
        arr[p]=temp;

        int i=l+1,l2=l,r2=r+1;
        while(i<r2){
            if(arr[i]<arr[l]){
                int temp2=arr[++l2];
                arr[l2]=arr[i];
                arr[i]=temp2;
                i++;
            }else if(arr[i]>arr[l]){
                int temp2=arr[--r2];
                arr[r2]=arr[i];
                arr[i]=temp2;

            }else{
                i++;
            }
        }
        int temp3=arr[l2];
        arr[l2]=arr[l];
        arr[l]=temp3;
        if(k<=l2-1){
            quicksort(arr,l,l2-1,k,random);
        }else if(k>=r2){
            quicksort(arr,r2,r,k,random);
        }else{
            return;
        }
    }
}
//大根堆
class Solution {
    public int[] smallestK(int[] arr, int k) {
        //排除特殊情况
        if(k==0 || arr.length==0) return new int[0];
        if(k==1){
            int ret=Integer.MAX_VALUE;
            for(int i=0;i<arr.length;i++){
                ret=Math.min(ret,arr[i]);
            }
            int[] ret2=new int[1];
            ret2[0]=ret;
            return ret2;
        }
        int[] pq=new int[k];
        for(int i=0;i<k;i++){
            pq[i]=arr[i];
        }
        for(int i=(k-1)/2;i>=0;i--){
            siftDown(pq,i,k);
        }
        for(int i=k;i<arr.length;i++){
            if(arr[i]<pq[0]){
                int temp=arr[i];
                arr[i]=pq[0];
                pq[0]=temp;
                siftDown(pq,0,k);
            }
        }
        return pq;
    }
    public void siftDown(int[] pq,int index,int k){
        while((index*2+1)<k){
            int j=index*2+1;
            if(j+1<k && pq[j+1]>pq[j]) j++;
            if(pq[index]<pq[j]){
                int temp2=pq[index];
                pq[index]=pq[j];
                pq[j]=temp2;
                index=j;
            }else break;
        }
    }
}

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

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

相关文章

zabbix 监控软件

zabbix 监控软件 自带图形化界面&#xff0c;通过网页就可以监控所有的服务器的状态。 事件告警&#xff0c;邮箱通知&#xff08;噩梦&#xff09;。 zabbix是什么&#xff1f; web界面提供的分布式监控以及网络监控功能的开源的企业级的软件解决方案。 服务端 监控端 客…

App安装来源追踪的四大方案解析

App的开发者和运营商&#xff0c;都会研究分析渠道的效果&#xff0c;而对渠道来源的追根溯源是一切分析的基础。假如没有明确的安装来源数据&#xff0c;至少会造成以下几种后果&#xff1a; 没有安装来源数据&#xff0c;我们无法判断各个投放渠道流量的价值&#xff0c;也就…

全网首发!鸿蒙OS登上PC,冒风险流出内测,系统界面截图,过会儿就删

开玩笑的啦&#xff0c;其实这是Deepin操作系统的截图&#xff0c;很漂亮吧&#xff0c;这是deepin v23 rc2 的主题之一 鸿蒙还没有发&#xff0c;不知道24年末还能不能上&#xff0c;emmm

Python实战:基础语法

一、求解列表中的最大元素 import random#定义函数 def get_max(lst):x lst[0] #x存储的是元素的最大值#遍历操作for i in range(1,len(lst)):if lst[i] > x:x lst[i] #对最大值进行重新赋值return x#调用函数 lst [random.randint(1,100) for item in range(10)] print…

基于SiliconCloud快速体验GraphRag.Net

SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型&#xff0c;提供高性价比的 GenAI 服务。 不同于多数大模型云服务平台只提供自家大模型 API&#xff0c;SiliconCloud上架了包括 Qwen、DeepSeek、GLM、Yi、Mistral、LLaMA 3、SDXL、InstantID 在内的多种开源大语言模…

sgetrf M N is 103040 时报错,这是个bug么 lapack and Openblas the same,修复备忘

1,现象 MN103040时&#xff0c;调用 sgetrf_ 时&#xff0c;无论是 LAPACK 还是 OpenBLAS&#xff0c;都出错&#xff1a; openblas&#xff1a; lapack&#xff1a; 2, 复现代码 出现问题的应该是由于M和N相对数字太大&#xff0c;乘积超出32bit整数的表达范围&#xff0c;…

【踩坑】TypeScript 中使用 sass 动态设置样式

问题 在从 Vue2 项目转向 Vue3 项目时&#xff0c;不得不将已经封装好的 echarts 图表也升级成 Vue3 适配的版本&#xff0c;遇到了一个有些诡异的问题&#xff0c;在此记录一下。 背景&#xff1a; 在 Vue2 的项目中&#xff0c;为了动态设置 echarts 的相关配置&#xff0c;于…

trie算法

1、定义 高效的存储和查找字符串集合的数据结构 它的优点是&#xff1a;利用字符串的公共前缀来减少查询时间&#xff0c;最大限度地减少无谓的字符串比较&#xff0c;查询效率比哈希树高 2、构建 我们可以使用数组来模拟实现Trie树。 我们设计一个二维数组 son[N] [26] 来…

WhatsApp收不到验证短信的原因及解决方案

在使用WhatsApp进行账号注册或验证过程中&#xff0c;有时会遇到无法收到验证短信的情况。这种情况可能会给用户带来诸多不便&#xff0c;但通常可以通过一些简单的方法来解决。本文将详细分析收不到验证短信的可能原因&#xff0c;并提供相应的解决方案&#xff0c;帮助用户顺…

LeetCode_sql_day15(262.行程与用户)

描述&#xff1a;262. 行程和用户 - 力扣&#xff08;LeetCode&#xff09; 取消率 的计算方式如下&#xff1a;(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 编写解决方案找出 "2013-10-01" 至 "2013-10-03" 期间非禁止…

EMF矢量图工具Graphpad Prism(棱镜科研绘图工具)

Graphpad Prism 是一款功能强大、专业实用的棱镜科研绘图软件&#xff0c;专为科研工作者而设计研发&#xff0c;可帮助用户进行专业便捷的科研图像绘制&#xff0c;通过该款软件用户可以进行新型子列图进行创建&#xff0c;可以进行平滑的线性图进行绘制&#xff0c;可以说是一…

【汉明距离总和】python刷题记录

R4-数与位篇 class Solution:def totalHammingDistance(self, nums: List[int]) -> int:#创建计数器trieCounter()max_bitlen(bin(max(nums)))-2ret0for i,num in enumerate(nums):for j in range(max_bit):#一位位地取出来bit(num>>j)&1if bit:reti-trie[j]trie[…

同态加密和SEAL库的介绍(一)简介

写在前面&#xff1a; 最近在做同态相关的内容&#xff0c;这里记录下相关的知识点和所踩过的坑&#xff0c;希望对大家有帮助。预计分几篇来详细介绍&#xff0c;从概念简介到不同模式介绍&#xff0c;具体包括了每种模式的编解码和加解密以及他们性能的比对。 虽然同…

MySQL 8.0新特性

文章目录 一. 账户与安全1. 查看用户信息2. 用户权限管理范围3. 用户创建和授权1&#xff09; 创建并授权用户2&#xff09;登录zhp&#xff0c;密码zhp.1221。验证数据库权限3&#xff09;查看用户权限4&#xff09;撤销用户权限5&#xff09;用户重命名&修改密码6&#x…

端到端 AWS 定量分析:使用 AWS 和 AWSCLI 自动运行脚本

使用 AWSCLI 启动、运行和关闭 AWS 服务器 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 欢迎来到雲闪世界。我们开发了两个 Python 脚本&#xff1b;一个用于为我们获取数据&#xff0c;另一个用于使用 sklearn 的决策树分类器处理数据。然后&#xf…

NAT、服务代理、内网穿透

文章目录 NAT技术NAT IP转换过程NATPNAT的优点NAT的缺点 代理服务器正向代理反向代理 内网穿透和内网打洞内网穿透内网穿透 NAT技术 NAT技术即网络地址转换技术。用于将私有IP地址转换为公共IP地址&#xff0c;以便在互联网或其他外部网络中通信。为了解决IPv4协议下IP地址不足…

【Nacos无压力源码领读】(三) Nacos 配置中心与热更新原理详解超详细解读

本文将从 Nacos 配置中心的基本使用入手, 详细介绍 Nacos 客户端发布配置, 拉取配置, 订阅配置的过程以及服务器对应的处理过程; 配置订阅以及热更新原理相关的部分, 我看了主流的博客网站, 绝对没有比这更详细的讲解; 如果在阅读过程中对文中提到的 SpringBoot 启动过程以及…

交叉编译nginx1.20.0

一、说明 简略写一下过程&#xff0c;仅用于参考&#xff0c;建议与其他交叉编译教程一起看&#xff0c;检查是否有遗漏的问题。 二、源码修改 1、auto/cc/name vi auto/cc/name 注释 21 行 exit 1。 2、auto/types/sizeof vi auto/types/sizeof 将 15 行处的” ngx_size”…

数字图像处理(理论篇)专栏介绍

专栏导读 数字图像处理是计算机视觉领域的基石&#xff0c;它涉及到图像的获取、表示、处理和分析等多个方面。本专栏将通过一系列精心挑选的实战案例&#xff0c;引导读者从基础概念到高级技术&#xff0c;逐步深入学习数字图像处理的各个方面。 专栏目录 数字图像处理 第一…

离线+树状数组,ABC253 F - Operations on a Matrix

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 F - Operations on a Matrix 二、解题报告 1、思路分析 我们通过差分树状数组&#xff0c;可以轻松解决操作1 操作3我们也可以通过树状数组来获取对应列的值 关键是操作2会对操作3造成影响 所以我们先对…