最小的K个数
- 时间限制:1秒
- 空间限制:32768K
- 本题知识点: 数组
题目描述
输入n个整数,找出其中最小的K个数。
例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
牛客网题目链接:点击这里
方法一:
VS2010代码:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> KNum;
int InputNum=input.size();
if(InputNum==0 || k==0 || k>InputNum) return KNum;
KNum.assign(input.begin(), input.begin()+k );
//对这K个数进行快速排序。
QuickSort(KNum, 0, k-1);
//用插入算法对后面的数进行遍历
for(int i=k; i<InputNum; i++ )
{
if(input[i]<KNum[k-1])
{
int j=k-1;
for(; input[i]<KNum[j-1] && j>0; j--)
{
KNum[j]=KNum[j-1];
}
KNum[j]=input[i];
}
}
return KNum;
}
void QuickSort(vector<int> &Array, int begin, int end)
{
if(begin>=end) return;
int temp=Array[begin];
int i=begin,j=end;
while(i<j)
{
while(i<j && Array[j]>temp) j--;
while(i<j && Array[i]<=temp) i++;
if(i!=j) swap(Array[j],Array[i]);
}
if(begin!=j)
swap(Array[begin],Array[j]);
QuickSort(Array,begin,j-1);
QuickSort(Array,j+1,end);
}
};
int main()
{
Solution s1;
vector<int> test1;
vector<int> result1;
test1.push_back(4);
test1.push_back(5);
test1.push_back(1);
test1.push_back(6);
test1.push_back(2);
test1.push_back(7);
test1.push_back(3);
test1.push_back(8);
//test1.push_back(4);
//s1.QuickSort(test1, 0, 8);
for(int i=0; i<test1.size(); i++)
cout<<test1[i]<<'-';
cout<<endl;
result1=s1.GetLeastNumbers_Solution(test1,4);
for(int i=0; i<result1.size(); i++)
cout<<result1[i]<<'-';
cout<<endl;
}
//桶排序,内存开销太大。基于事先知道输入数字的范围。
//快速排序和插入排序相结合。
//测试用例:[]。 输出应为空[];
//测试用例:[4,2,6,3],7。 输出应为空[]
方法二:
//方法二:有快速排序法的思想启发而来,只要最小的K个数,而不需要对这K个数排序。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> KNum;
int InputNum=input.size();
if(InputNum==0 || k==0 || k>InputNum) return KNum;
//改进快速排序方法
QuickSort1(input,0,InputNum-1,k);
KNum.assign(input.begin(),input.begin()+k);
//对选定的数进行快速排序
QuickSort(KNum,0,k-1);
return KNum;
}
void QuickSort1(vector<int> &Array, int begin, int end, int k)
{
if(begin>=end) return;
int temp=Array[begin];
int i=begin,j=end;
while(i<j)
{
while(i<j && Array[j]>temp) j--;
while(i<j && Array[i]<=temp) i++;
if(i!=j) swap(Array[j],Array[i]);
}
if(begin!=j)
swap(Array[begin],Array[j]);
if(j==k-1 || j==k) return;
if( k<j )
QuickSort1(Array,begin,j-1,k);
if( k>j)
QuickSort1(Array,j+1,end,k);
}
void QuickSort(vector<int> &Array, int begin, int end)
{
if(begin>=end) return;
int temp=Array[begin];
int i=begin,j=end;
while(i<j)
{
while(i<j && Array[j]>temp) j--;
while(i<j && Array[i]<=temp) i++;
if(i!=j) swap(Array[j],Array[i]);
}
if(begin!=j)
swap(Array[begin],Array[j]);
QuickSort(Array,begin,j-1);
QuickSort(Array,j+1,end);
}
};