【牛客刷题】每日一练——最小K个数

news/2024/5/20 13:54:42/文章来源:https://blog.csdn.net/m0_62426532/article/details/127305418

✨hello,进来的小伙伴们,你们好耶!✨

🍅🍅系列专栏:【牛客刷题】

✈️✈️本篇内容:  最小K个数!

⛵⛵作者简介:一名双非本科大三在读的科班Java编程小白,道阻且长,你我同行!

给大家推荐一个超级好用的刷题网站—牛客网!点击链接注册,开启刷题之路!

一、最小K个数

原题链接:最小K个数在线OJ

问题描述设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:

0 <= len(arr) <= 100000
0 <= k <= min(100000, len(arr))

问题分析:这道题一上来大家肯定都会觉得非常简单,不就是数组中求前K个最小的元素嘛,直接数组排好序,然后循环打印出前K个元素就结束了呗,那么我们先实现这种方法!

方法一:

class Solution {public int[] smallestK(int[] arr, int k) {int[] vec = new int[k];Arrays.sort(arr);for (int i = 0; i < k; ++i) {vec[i] = arr[i];}return vec;}
}

复杂度分析

时间复杂度:O(nlogn),其中 n 是数组 arr 的长度。算法的时间复杂度即排序的时间复杂度。

空间复杂度:O(logn),排序所需额外的空间复杂度为 O(logn)。

方法二:

那么这一题的话就涉及到我们的数据结构中的Top-k问题(涉及到优先级队列的知识)

TOP-K问题:即求数据集合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。
比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决,基本思路如下:
1. 用数据集合中前K个元素来建堆
前k个最大的元素,则建小堆
前k个最小的元素,则建大堆
2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素。
将剩余N-K个元素依次与堆顶元素比完之后,堆中剩余的K个元素就是所求的前K个最小或者最大的元素。

代码实现:

class Solution {public int[] smallestK(int[] arr, int k) {int[] vec = new int[k];if (k == 0) { // 排除 0 的情况return vec;}PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {public int compare(Integer num1, Integer num2) {return num2 - num1;}});for (int i = 0; i < k; ++i) {queue.offer(arr[i]);}for (int i = k; i < arr.length; ++i) {if (queue.peek() > arr[i]) {queue.poll();queue.offer(arr[i]);}}for (int i = 0; i < k; ++i) {vec[i] = queue.poll();}return vec;}
}

复杂度分析

时间复杂度:O(nlogk),其中 nn 是数组 arr 的长度。由于大根堆实时维护前 k 小值,所以插入删除都是 O(logk) 的时间复杂度,最坏情况下数组里 n 个数都会插入,所以一共需要 O(nlogk) 的时间复杂度。

空间复杂度:O(k),因为大根堆里最多 k个数。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《漂浮城堡历险记》的云端之旅

《漂浮城堡历险记》是 The Sandbox 游戏制作基金支持的项目之一。让我们告诉你更多关于这个 The Sandbox 元宇宙独有的、令人上瘾的奇幻游戏的信息吧。它已在 The Sandbox Alpha 第 3 季中上线了&#xff01; 关于体验 在《漂浮城堡历险记》这个冒险战斗游戏中&#xff0c;玩家…

基于深度学习的机载激光扫描森林单株茎的检测、分割与模型拟合

Abstract 精确测量树木的结构特征&#xff0c;如高度、直径、宽度和锥度&#xff0c;是森林资源调查的重要组成部分。目前&#xff0c;地面和空中激光雷达都被用来产生点云数据&#xff0c;通过这些数据可以确定清单指标。陆地/地面扫描通常提供每平方米数千个点的点云分辨率&…

(附源码)计算机毕业设计ssm核酸结果查询系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【 java 多线程】同步锁 (Lock) 解决线程的安全问题

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

计算机网络课程设计——中小型网络工程设计

文件地址:https://github.com/Recursiondzl/Computer-Network 摘 要&#xff1a;本次计算机网络实践&#xff0c;完成了中小型网络工程设计与实现对计算机网络知识进行了系统的复习&#xff0c;实践能力获得了巨大的提升。 中小型网络工程设计与实现中&#xff0c;使用路由器…

DDD初步简单理解

概述 最近有一个项目要使用DDD模式来写&#xff0c;大致整理一下笔记。 问题&#xff1a;为什么要使用DDD&#xff1f;大概要怎么使用DDD&#xff1f; 目录 概述 MVC和DDD比较 实例介绍 简洁代码逻辑示例 总结 MVC和DDD比较 MVC&#xff08;module&#xff0c;view&#xff0c…

最适合跑步用的耳机有哪些、精选五款最优秀的跑步耳机推荐

越来越多的人选择在运动的时候佩戴蓝牙耳机&#xff0c;身为健身教练&#xff0c;也有很多人会让我们推荐蓝牙耳机&#xff0c;那么现在到底市面上哪些机型是最适合跑步的时候用的呢&#xff1f;我趁着最近有空搜集了一些资料跟我使用过的经验&#xff0c;给大家整理了一份最值…

揭秘EVM Opcodes

1. 引言 本文主要源自Macro团队的Gilbert在ETHNewYork 2022分享 Demystifying EVM Opcodes&#xff0c;同时结合evm.codes来理解。 学习EVM Opcodes&#xff0c;可成为更好的Solidity工程师。 更好的Solidity工程师&#xff0c;意味着&#xff1a; 1&#xff09;理解Solidity…

【新手向】Rock5B官方Debian系统设置中文环境(简单设置)和远程桌面连接

一、环境与说明 Rock5B的系统&#xff1a;官方Debian11&#xff08;2022-10-01版本&#xff09; 前面的两篇文章都是在2022-09-19版本镜像中操作的&#xff0c;2022-10-01版本内置了中文字体&#xff0c;不要自己下载了。目前Rock5B的硬件版本是v1.42&#xff0c;大概在23年初…

一致性哈希原理

一致性哈希原理 分布式系统将数据分布到不同的节点来存储&#xff0c;比如一个分布式KV&#xff08;key-value&#xff09;缓存系统&#xff0c;某个key应该到哪个节点上获得&#xff0c;最直观的方法是使用哈希算法&#xff08;hash(key)%n&#xff09;&#xff0c;对key进行…

python--绘制WRF模式近地面风场以及辐射

使用python自动化绘制WRF模式输出的风场以及辐射 本脚本主要用来自动化处理WRF模式数据&#xff0c;可以根据自己指定的时间范围以及时间步长绘制相应的数据 1 导入库 import cmaps import numpy as np import glob from netCDF4 import Dataset import matplotlib.pyplot a…

【C++】从零开始的CS:GO逆向分析3——写出一个透视

【C++】从零开始的CS:GO逆向分析3——写出一个透视本篇内容包括:1. 透视实现的方法介绍2. 通过进程名获取进程id和进程句柄3. 通过进程id获取进程中的模块信息(模块大小,模块地址,模块句柄)4. 读取游戏内存(人物ViewMatrix,敌人坐标,敌人生命值,敌人阵营)5. 三维坐标…

Java项目本地部署搭建实战SpringBoot高校宿舍管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的SpringBoot高校宿舍管理系统源码。 技术架构 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Mysql5.7 layui运行环境&#xff1a;jdk8 IntelliJ IDEA maven3 宝塔面板 …

触摸屏分类和触摸屏校准原理

一、触摸屏分类 常用触摸屏分两种 1、电阻触摸屏校正原理&#xff1a;导电ITO层及整个电路电阻值会随时间电压等轻微偏移&#xff0c;为了更精确与LCD显示屏上的功能图案相对应&#xff0c;重新校正计算标准位置。不校正可能会线性偏移&#xff0c;好的触摸屏一般无需校正&am…

【面经】360大数据开发面经

30 分钟&#xff0c;不做题。 欢迎点击此处关注公众号&#xff0c;每天分享大数据开发面经 介绍实习项目 会涉及平台开发吗 平时常用的语言 回答了 Java。 Python 用过吗 Java 实现一个单例要注意什么 懒汉式&#xff1a; public class Singleton {private static Sing…

钢铁行业经销商商城系统:完善钢材管控方案,轻松实现控价和防伪

钢铁工业是全球经济发展的核心&#xff0c;也是现代社会可持续发展的核心。根据数据显示&#xff0c;2020年中国钢材产量为13.25亿吨&#xff0c;同比增长9.96%;生铁产量为8.88亿吨&#xff0c;同比增长9.77%;粗钢产量为10.53亿吨&#xff0c;同比增长5.72%。 图片来源&#xf…

网络编程之TCP模型

1. TCP模型 2. socket 最早的socket和消息队列、共享内存、管道一致&#xff0c;只能实现一台主机多个进程间通信&#xff0c;后期加入了tcp/ip协议&#xff0c;使得支持不同主机的进程间通信 socket本质上是一个编程接口给&#xff08;API&#xff09;,是对TCP/IP协议的封装…

利用表面肌电信号对手部抓取动作分类的新型卷积网络模型

利用表面肌电信号对手部抓取动作分类的新型卷积网络模型 文章目录利用表面肌电信号对手部抓取动作分类的新型卷积网络模型一.相关研究二.材料和方法2.1 数据集2.2 数据预处理2.3 1D-1D-CNN三.实验结果分析四.相关研究对比参考文献一.相关研究 肌电信号号代表肌肉功能的特征&…

ReentrantLock可重入、可打断、锁超时实现原理

述 前面讲解了ReentrantLock加锁和解锁的原理实现&#xff0c;但是没有阐述它的可重入、可打断以及超时获取锁失败的原理&#xff0c;本文就重点讲解这三种情况。 可重入 可重入是指一个线程如果获取了锁&#xff0c;那么它就是锁的主人&#xff0c;那么它可以再次获取这把锁…

神经网络损失函数不下降,神经网络参数优化算法

1、matlab支持向量机预测数据怎么减小相对误差 采用网格搜索法。基于长短时记忆神经网络算法的支持向量机的预测方法&#xff0c;为了保证支持向量机预测结果的准确性减小相对误差&#xff0c;选用网格搜索法对支持向量机参数进行优化处理。为了减小在预测算法中&#xff0c;由…