《剑指offer》最小的K个数

本文介绍了一种高效算法,用于从一组整数中找到最小的K个数。通过部分排序而非完全排序的方法来提高效率,特别适用于K相对较小的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】


题目链接:http://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking


题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

思路
我们可以直接排序然后取出前K个数,当然这种时间复杂度并不是最好的,对于k比较小的时候,直接排序会比较浪费时间
我们可以先保存前K个数进结果数组,然后再将其排序,然后当数组出现新的比现在结果数组最大的数小的数的时候,我们再弹出结果数组最大的数

class Solution
{
	public:
		vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
		{
			int len = input.size();
			vector<int> ans;
			if(k<1 || k>len)
				return ans;
			for(int i = 0; i<len; i++)
			{
				if(ans.size()<k)
				{
					ans.push_back(input[i]);
					if(ans.size()==k)
						sort(ans.begin(),ans.end());
				}
				else
				{
					if(input[i]<ans[k-1])
					{
						ans[k-1] = input[i];
						if(k>1 && ans[k-1]<ans[k-2])
							sort(ans.begin(),ans.end());
					}
				}
			}
			return ans;
		}
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值