求最小的K个数

题目描述:

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

解读:

  1.  首先想到的就是利用排序的方式,将整个数列从小到大排序,从排序后的数列中就能得到最小的K个数
  2. 利用STL容器中Partition算法可以使得把数列按照大于和小于平均值分成两部分放在左右两边并且可以得到中间数据的位置,这样就可以利用这种算法,进行多次操作,首先如果求得第一次的中间数据位置大于K-1(从0开始的话),那么说明我们求得的位置值大了(如果小于K-1,那么说明我们求得的位置值小了),继续在该位置的左边进行相同的操作(但是此时操作的数列起始和末尾位置是上次的起始位置和求得到的中间数据的位置),继续求得一个中间数据的位置,进行判断与K的大小比较,一直下去总能找到一个等于K-1的值,这样求得K-1的位置之后,第k-1和包括左边位置的所有元素都是我们所要求的数据。

代码:

/*方法1*/
class solution
{
	public:
		vector<int> LeastNumbers(vector<int> input, int k)
		{
			sort(input.begin(),input.end());
			vector<int> result;
			for(int i=0;i<k;i++)
			{
				result.push_back(input[i]);
			}
			return result;
		}
}
/*方法2*/
class solution
{
	public:
		vector<int> LeastNumbers(vector<int> input, int k)
		{
			int length=input.length();
			int start=0;
			int last=length-1;
			int index=0;
			vector<int> result;
			index=partition(input,start,last);
			while(index!=k)
			{
				if(index>k)
				{
					end=index;
					index=partition(input,start,last);
				}
				else
				{
					start=index;
					index=partition(input,start,last);
				}
			}
			
			for(int i=0;i<k;i++)
			{
				result.push_back(input[i]);
			}
			return result;
		}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值