查找最小的k个元素

Nginx&&Keepalived(一)Keepalived介绍 一、背景: 案例1:如现有服务my-service-demo,希望实现高可用和负载均衡: 首先,my-service-demo服务部署在两台机器上,通过nginx去代理这两个节点,负载均衡就实现了。如果只有一个nginx,这台nginx机器一旦宕机,访问nginx会报错。这时候在另外一台机器nginx2上也安装nginx,并配置同样的代理,可以解决上述问题,但是暴露给用户的只有一个域名(或ip),不可能给用户提供两个域名,域名1(nginx机器1)访问不了了再让用户访问域名2(nginx机器2),这 阅读详情

题目:输入n个整数,输出其中最小的k个。

例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。

 

我们可以先创建一个大小为k的数据容器来存储最小的k个数字。接下来我们每次从输入的n个整数中读入一个数。如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器之中;如果容器中已有k个数字了,也就是容器已满,此时我们不能再插入新的数字而只能替换已有的数字。我们找出这已有的k个数中最大值,然和拿这次待插入的整数和这个最大值进行比较。如果待插入的值比当前已有的最大值小,则用这个数替换替换当前已有的最大值;如果带插入的值比当前已有的最大值还要大,那么这个数不可能是最小的k个整数之一,因为我们容器内已经有k个数字比它小了,于是我们可以抛弃这个整数。

因此当容器满了之后,我们要做三件事情:一是在k个整数中找到最大数,二是有可能在这个容器中删除最大数,三是可能要插入一个新的数字,并保证k个整数依然是排序的。如果我们用一个二叉树来实现这个数据容器,那么我们能在O(logk)时间内实现这三步操作。因此对于n个输入数字而言,总的时间效率就是O(nlogk)。

我们可以选择用不同的二叉树来实现这个数据容器。由于我们每次都需要找到k个整数中的最大数字,我们很容易想到用最大堆。在最大堆中,根结点的值总是大于它的子树中任意结点的值。于是我们每次可以在O(1)得到已有的k个数字中的最大值,但需要O(logk)时间完成删除以及插入操作。

public class findLeastNumbers {
	// 大顶堆
	public static void main(String[] args) {
		int[] arr = { 1,2,3,4,5,6,7,8 };
		int k = 4;
		findLeastNumber(arr,k);
	}
	public static void Adjustdown(int[] arr, int s, int m) {// 向下调整堆,删除时使用
		int temp = arr[s];
		int j;
		for (j = 2 * s + 1; j <= m; j = 2 * j + 1) {
			if (j < m && arr[j + 1] > arr[j])
				++j;
			if (temp > arr[j])
				break;
			arr[s] = arr[j];
			s = j;
		}
		arr[s] = temp;
	}

	public static void delete(int[] arr) {
		// 删除堆中的节点,安定义,堆中每次都只能删除第0个数据
		int len = arr.length;
		int temp  = arr[0];
		arr[0] = arr[len-1];
		arr[len-1] = temp;
		Adjustdown(arr, 0, len - 2);
	}

	public static void Adjustup(int[] arr, int i) {
		// 向上调整堆,插入节点时使用,每次插入都是将新数据放在数组最后。
		// 可以发现从这个新数据的父结点到根结点必然为一个有序的数列,
		// 因此需自下往上调整堆
		// i为数组中最后一个元素的下标
		int temp = arr[i];
		int j = (i - 1) / 2;// 父节点坐标
		while (j >= 0 && i != 0) {
			if (arr[j] > temp)
				break;
			arr[i] = arr[j];
			i = j;
			j = (j - 1) / 2;
		}
		arr[i] = temp;
	}

	public static void insert(int[] arr, int n, int num) {
		// 在数组arr中插入节点i
		arr[n] = num;
		Adjustup(arr, n);
	}

	public static void findLeastNumber(int[] arr, int k) {
		// 找到arr数组里最小的k个数
		if (arr.length == 0) {
			System.out.println("数组为空!");
			return;
		}
		int[] heapvector = new int[k];// 堆容器
		int i = 0;
		while (i < k) {
			insert(heapvector, i, arr[i]);
			i++;
		}
		for(int j=k;j<arr.length;j++){
			if(arr[j]<heapvector[0]){
				delete(heapvector);
				insert(heapvector,k-1,arr[j]);
			}
			
		}
		for(int j = heapvector.length-1;j>0;j--){
			int temp = heapvector[j];
			heapvector[j] = heapvector[0];
			heapvector[0] = temp;
			Adjustdown(heapvector,0,j-1);
		}
		for(int j = 0;j<heapvector.length;j++)
		System.out.println(heapvector[j]);
	}

}


 

 

【2026年华为暑期实习(非AI方向(通软&嵌软&测试&算法&数据科学))-4月8日-第一题- 包裹的编码】(题目+思路+Java&C++&Python解析+在线测试) 摘要:该问题要求将给定的十进制整数N转换为混合进制编码字符串,并处理回文检测。首先根据N的符号位确定编码首位(0或1),然后按输入的进制序列依次对N的绝对值进行取余和整除操作,得到编码数组。将数组元素转换为字母后生成字符串,若字符串为回文则添加"(palindrome)"后缀;否则输出最长回文子串(字典序最小)。算法采用中心扩展法检测回文,时间复杂度为O(L²),空间复杂度为O(L),其中L为字符串长度。 阅读详情

相关推荐

知识图谱-Neo4j-开始构建知识图谱-01

关系(Relationships):连接两个节点,具有方向(→ 或 ←)和类型(Type),可附加属性。 属性(Properties):键值对,存储节点或关系的详细信息(如 , )。 (2) Cypher 查询语言 直观语法:通过模式匹配直接描述图结构。 高效遍历:支持复杂关系路径查询(如最短路径、模式匹配)。 3. 核心优势 (1) 原生图存储 物理存储优化:数据以图结构直接存储,避免传统数据库的“表连接”开销。 高效遍历:通过指针直接访问相邻节点,时间复杂度接近 O(1)。 (2) 高性

寓教于乐。教己助人 1万+

牛客网|输入n个整数,输出其中最小的k个

题目信息 输入n个整数,输出其中最小的k个。 本题有多组输入样例,请使用循环读入,比如while(cin>>)等方式处理 输入描述: 第一行输入两个整数n和k 第二行输入一个整数数组 输出描述: 输出一个从小到大排序的整数数组 示例输入: 5 2 1 3 5 7 2 示例输出: 1 2 题解 题意很明确,给一个指定大小的数组,对数组内容排序,然后取排序后的前k个元素 编码 import java.io.BufferedReader; import java.

蜗牛学习笔记 1693

自制《大侠狂想曲》修改器:内存修改、加速与一键安装全攻略

游戏修改器是玩家优化游戏体验的常用工具,其核心原理是通过内存修改技术,在游戏进程运行时动态改写数值。常见实现路径是借助Cheat Engine扫描并追踪数据地址,再通过编程语言调用系统API完成读写。这种技术能有效解决重复刷资源带来的枯燥感,特别适用于单机RPG中想快速体验多剧情线却不想重刷资源的情形。本文以《大侠狂想曲》为例,完整拆解了从CE定位金钱与好感度内存地址,到编写C#脚本实现游戏加速、一键增加铜钱与NPC好感度,再到用Inno Setup打包生成一键安装器的全过程,并总结了数值弹回、剧情不触发、

weixin_30368981的博客 1464

时间效率---最小的K个数

题目描述: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路: Python实现: // An highlighted block var foo = 'bar'; ...

qq_turn 414

数学建模常用模型10 :数据包络(DEA)分析法(投入产出法)

数据包络分析是评价多输入指标和多输出指标的较为有效的方法,将投入与产出进行比较。它的结果包含的意思有: ①θ=1,DEA有效,表示投入与产出比达到最优 ②θ&lt;1,非DEA有效,表示投入与产出比没有达到最优,一般来说,θ越大说明效果越好。 数据包络分析是通过对投入的指标和产出的指标做了一个线性规划,并且进行变换后,然后根据其线性规划的对偶问题(线性规划对偶问题具有经济学意义),求解这个对...

HaLosec_Wei 9万+

【RTD】二分法查找和分段线性插值算法在RTD中应用

二分法查找和分段线性插值算法在RTD中的典型应用。

只要思想不滑坡,想法总比问题多。 2371

程序员面试题精选(05)-查找最小的k个元素

题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。 我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,...

wdp107 377

YOLOv8剪枝 稀疏训练+slim剪枝测试精度仅掉1.6个点,速度提高10.3fps!

摘要 本文介绍了YOLOv8剪枝方法Slim(Network Slimming),通过L1正则化作用于BN层的缩放因子(γ),自动识别并剪除冗余通道,实现模型轻量化。核心步骤包括:稀疏训练(引入L1正则化)、通道剪枝(按γ阈值裁剪)、微调恢复精度。实验表明,该方法能有效压缩模型大小、减少计算量,且支持通过调整speed_up等超参数控制剪枝强度。移植代码需修改C2F模块以适配剪枝,并配置稀疏训练参数(如reg、sl_epochs)。最终剪枝模型需移除优化器以减小体积,但不支持多卡训练。

FJN110的博客 861

输入 n 个整数,输出其中最小的 k 个—7种方法实现

输入 n 个整数,输出其中最小的 k 个

u013322907的专栏 8068

Access查询中的Dlookup函数的妙用

在Microsoft Access中,处理和分析数据的过程中,常常会遇到需要根据条件从其他记录中提取特定数据的情况。这时候,Dlookup函数就成了开发者和数据分析师的得力助手。今天我们将通过一个具体的实例,详细探讨如何利用Dlookup函数来解决复杂的查询问题。

m0_62153576的博客 295

第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)

本文详细介绍了TMC2240电机驱动芯片的正反转实现方法,重点解决方向切换时的抖动和冲击问题。文章首先明确了硬件连接、基础配置和使能状态三个前提条件,然后阐述了DIR引脚电平控制方向的核心原理,提供了STM32的GPIO配置代码。针对方向切换时的电流冲击问题,作者提出了"停止-延迟-切换-启动"的平滑切换逻辑,并给出了包含方向枚举、转速控制和方向切换函数的完整代码实现方案。通过这种优化方法,可以有效避免电机在正反转切换时产生的抖动、冲击声和发热问题,实现稳定的双向控制。文章还提示了后续可

BackCatK Chen的博客 2076

剑指offer打卡Day16:最小的k个数(优先队列与快速排序)

剑指offer打卡Day16:最小的k个数(优先队列与快速排序) 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。 示例 输入 [4,5,1,6,2,7,3,8],4 返回值 [1,2,3,4] 解析: 万物皆可用暴力法破解: 对数组进行判断,(判断非空与 k>input.length 或者K==0 等情况) 对数组进行排序,默认排序都是从小到大进行排序 遍历数组,同时记得维护非重和count计数(以k为标

COOLGWAYNE_TECH_BLOG 412

uniapp [全端兼容] - 详细实现全局修改设置字体大小功能效果,统一修改页面字号字体大小,一键改变字号整个项目立即生效,大中小字号预设、老年人大字模式场景,uniApp全平台兼容控制页面字号大小

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,修改字体大小,一键调整UniApp字体大小,实时改变不用刷新,动态设置字体大小,uniapp全局修改字体字号大小,如何控制全局字号,可调整显示的字体,全项目生效,老年人大字模式,改变所有页面的字体,全局设置字体大小,实现小中大的字体切换,设置改变全局字体大小功能,如何做到全平台兼容,H5APP实现全局字体大小调整,不兼容报错,用户设置字号,全局设置应用字体大小,大中小字体修改,页面设置page-me

🏆 前端领域优质创作者 1万+

在一个数组中查找最大的K个元素或者最小的K个元素

面试中经常会遇到查找最大的K个元素或者最小的K个元素的问题。如果是查找最大的K个元素,就用小根堆,如果当前元素比堆的根都元素大,那么一定要放到堆里来,用当前元素替换根元素(因为根的元素是最小的),然后调整堆。查找最小的K个元素用大根堆同理。 上代码: #include using namespace std; //在数组arr[1..size]中,使得以i为根的子堆保持大根堆的

ZkvIA的博客 1623

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

用堆排序实现查找最小的K个元素

转载自:http://blog.chinaunix.net/uid-28977986-id-3864505.html  2013-08-24 19:25:51 分类: C/C++ 题目:查找最小的k个元素。 利用堆排序解决这个问题的思路有两种:    思路 1:将输入的n个数建立成大顶堆并排序后,再遍历输出前k个元素,此k个元素即使最小的K个元素。  

IT小小鸟 2794

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

查找最小的k 个元素

排序 一、题目:(感谢 http://blog.youkuaiyun.com/v_JULY_v 提供的题目) 查找最小的k 个元素 输入n 个整数,输出其中最小的k 个。 例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。  二、分析: 看到题目的第一个想法,先把输入的n个整数排序,再输出最小的k个元素。 下面比较每

wonka438的专栏 3699

查找最小的k 个元素之C#算法实现

紧接着上一篇微软编程面试100题,这次想解决的是查找最小的K个元素,题目是:输入n 个整数,输出其中最小的k 个。例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。 看到题目的时候我第一反应,这题很简单,使用任何方式的排序将数列按顺序存储,之后遍历需要的k个元素即可,于是自己动手很容易就完成了,但是后来在网络上发现很多人对这题的解决方式是用小...

220

5.查找最小的 k个元素

/* 5.查找最小的 k个元素 题目:输入n整数,输出其中最小的k个。 例如输入 1,2,3,4,5,6,7 和8这8个数字, 则最小的4个数字为1,2,3 和 4。 大部分人都是用具有k个元素的大根堆来实现,这里看到个更简单的 题中没有要求我们按大小顺序输出其中的最小的k个数!仅仅要求输入这个k个数而已。 这就提示我们不必对所有数据进行排序,只需找出这k个最小数而已。 只需申请k个大小的

小人物的草稿本 1001

查找最小的K个元素,使用最大堆。

查找最小的K个元素,使用最大堆,具体代码如下:

尹成的技术博客 2714

【100题】查找最小的k个元素

//查找最小的k个元素 #include #include #include using namespace std; typedef multiset> IntHeap; void FindKLeastNumbers ( const vector &data, IntHeap &leastNumbers, unsigned int k ) { leastNumbers.clea

Life Coding 1538

【题目】设计程序:查找最小的k个元素:输入n个整数,输出其中最小的k个。

/**************************** * 文件名:[作业] * 作者:〈漆黑〉 * 描述:〈 设计程序:查找最小的k个元素:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 〉 * 创建时间:2019.5.13 ****************************/ #include <i...

漆黑梦工厂 822

查找最小的k 个元素题目

//题目:查找最小的k 个元素题目:输入n 个整数,输出其中最小的k 个。 思想:两个数组,一个用于存储输入的n 个整数,另一个用于存储当前比较的数中最小的k个整数,按从小到大排列。那么排序数组中第k 个数是当前k个数中最大的。和n个数的数组中元素一个个比较,最终保证存k个元素的数组中存储的是所有数中最小的k个数。   #include using namespace std; #

liu_qiqi的专栏 787

查找数组中最小的k 个元素

查找数组中最小的k 个元素 输入n 个整数,输出其中最小的k 个。 例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。 经典的TopK问题,因为需要最小的K个元素,所以只需创建并维持一个拥有K个元素的最大堆即可。 创...

146

Java查找最小的k个元素

Java查找最小的k个元素 题目描述:查找最小的k 个元素 运行结果: package test; import java.util.Scanner; public class Minmum { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int i=0,j=0,temp=0; int n=sc.nextInt(); int[] a=new int[n]; for(i=0;i&

m0_45687585的博客 297
上一篇: 堆的插入 删除 排序
下一篇: 排序数组中和为给定值的两个数字
tanyujing
博客等级 码龄18年 135粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值