【剑指】39,最小的k个数

题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路:
1,维护一个小顶堆。最后依次弹出四个数字。
2,基于快排的思想,排序到第k个就返回。
快排:先固定一个哨兵,然后从high和low开始比。遇到a[high] <哨兵的就赋值给小的。然后low++;最后看low和high相等否

代码:

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
	int size=input.size()-1;		//尾
	vector<int> res;
	if(siez<0 }} input.size()<k)	return res;
	getthenumber(input,0,size,k);
	for(int i=0;i<k;i++)
		res.push_back(input[i]);
	return res;
}

private:
	void getthenumber(vector<int> &num, int l,int r,int k)
	{
		if(l<r)
		{
			int low =l,high=r;
			int sentry=num[l];
			while(low<high)
			{
				while(low<high && num[high]>sentry)
					high--;
				if(low<high)
					num[low++]=num[high];
				while(low<high && num[low]>sentry)
					low++;
				if(low<high)
					num[high--]=num[low];
			}
			num[low]=sentry;
			if(low+1==k)
				return ;
			else if(low+1>k)
				getthenumber(num,l,low-1,k);
			else
				{
					getthenumber(num,l,low-1,k);
					getthenumber(num,low+1,r,k);
					}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值