题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解题思路:
使用快排的思路,每一次交换以后判断右边的数的个数,大于k的话在右边找最小的k个,小于k的话在左边找最小的k-r(r位右边的长度),等与k的话直接返回
或者直接找partition点,如果parttion点恰好等于k-1就返回,如果大于k-1则在partition左边找,如果小于k-1则在partition右边找。
# -*- coding:utf-8 -*-
class Solution:
def partition(self, array, start, end):
temp = array[start]
low = start
high = end
while low<high:
while low<high and array[high]>=temp:
high -= 1
array[low] = array[high]
while low<high and array[low]<=temp:
low += 1
array[high] = array[low]
array[low] = temp
return low
def GetK(self, array, k):
l = len(array)
start = 0
end = l - 1
ind = self.partition(array, start, end)
while ind != k - 1:
if ind < k -1:
start = ind + 1
ind = self.partition(array, start, end)
if ind > k-1:
end = ind - 1
ind = self.partition(array, start, end)
return ind
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if k<=0 or len(tinput) < k:
return []
if len(tinput) == k:
return sorted(tinput)
ind = self.GetK(tinput, k)
return sorted(tinput[:ind+1])
C++:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> KMinList;
if(k>input.size()||input.empty()){return KMinList;}
int start=0,end=input.size()-1;
int p=Partition(input,start,end);
while(p!=k-1){
if(p<k-1){
start=p+1;
p=Partition(input,start,end);
}else{
end=p-1;
p=Partition(input,start,end);
}
}
for(int i=0;i<k;i++)
{
KMinList.push_back(input[i]);
}
return KMinList;
}
int Partition(vector<int> &input, int start, int end){
if(input.empty()||end<start){return -1;}
int tmp=input[end];
int j=start-1;
for(int i=start;i<end;i++){
if(input[i]<=tmp){
j++;
if(i!=j) swap(input[i], input[j]);
}
}
swap(input[j+1],input[end]);
return (j+1);
}
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
};