// 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
class Solution {
public:
void Swap(int* a, int *b) {
int nTemp = *a ;
*a = *b ;
*b = nTemp ;
}
int Partition(int a[], int length, int start, int end) {
if(a == NULL || length <= 0 || start < 0 || end >= length || end < start) return 0 ;
if(start == end) return start ;
int nRand = start + rand() % (end - start + 1) ;
int small = start - 1 ;
Swap(&a[nRand], &a[end]) ;
for(int i = start; i < end; ++i) {
if(a[i] < a[end]) {
++small ;
if(small != i) {
Swap(&a[small], &a[i]) ;
}
}
}
++small ;
Swap(&a[small], &a[end]) ;
return small ;
}
// O(nlogk)
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
std::vector<int> vecRet ;
if(input.size() == 0 || k <= 0 || k > input.size()) return vecRet ;
std::multiset<int, std::greater<int> > setTemp ;// must set compare operator
for(std::size_t i = 0; i < input.size(); ++i) {
if(setTemp.size() < k) {
setTemp.insert(input[i]) ;
}else {
if(input[i] < *setTemp.begin()) {// if the size of set over k,then should replace biggest when have smaller node to input
setTemp.erase(setTemp.begin()) ;
setTemp.insert(input[i]) ;
}
}
}
for(std::multiset<int, std::greater<int> >::iterator it = setTemp.begin(); it != setTemp.end(); ++it) {
vecRet.push_back(*it) ;
}
return vecRet ;
}
vector<int> GetLeastNumbers_Solution1(vector<int> input, int k) {// disadvantage: can change input value
std::vector<int> vecRet ;
int nLen = input.size() ;
if(nLen == 0 || k <= 0 || k > nLen) return vecRet ;
int nStart = 0 ;
int nEnd = nLen - 1 ;
int nIndex = Partition(input.data(), nLen, nStart, nEnd) ;
while(nIndex != k - 1) {
if(nIndex < k - 1) {
nStart = nIndex + 1 ;
nIndex = Partition(input.data(), nLen, nStart, nEnd) ;
}else {
nEnd = nIndex - 1 ;
nIndex = Partition(input.data(), nLen, nStart, nEnd) ;
}
}
for(int i = 0; i < k; ++i) {
vecRet.push_back(input[i]) ;
}
return vecRet ;
}
};
最小的K个数
最新推荐文章于 2024-01-23 09:34:00 发布