《劍指offer》——最小的K個數
阿新 • • 發佈:2018-12-09
最小的K個數
題目:輸入n個整數,找出最小的K個數,例如輸入4,5,1,6,2,7,3,8,則輸出1,2,3,4。
一定要考慮邊界情況: - 陣列為空 - k大於陣列size - k小於0
思路一:最直接的想法,就是先對陣列排序,然後輸出前k個數。複雜度為 。 快排
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> k_input;
if (k > input.size() || input.size()<=0) return k_input;
int low = 0;
int high = input.size()-1;
quickSort(input, low, high);
//vector<int> k_input(&input.at(0), &input.at(k-1));
for(int i=0; i<k; i++) k_input.push_back(input.at(i));
return k_input;
}
void quickSort(vector<int>& input, int low, int high){
int mid = Partition(input, low, high);
if(mid<high) quickSort(input, mid+1, high);
if(mid>low) quickSort(input, low, mid-1);
}
int Partition(vector<int>& input, int low, int high){
int p = input[low];
while(low<high){
while(low<high && p<=input[high]) high--;
input[low] = input[high];
while(low<high && p>=input[low]) low++;
input[high] = input[low];
}
input[low] = p;
return low;
}
};
思路二:遍歷整個陣列,將當前元素與k_input陣列進行比較,按照順序插入,並且超出k的部分刪除,最終直接返回k_input。時間複雜度 。(該思想與氣泡排序思想類似)。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> k_input;
if(k>input.size() || input.size()<=0) return k_input;
k_input.push_back(input.at(0));
for(auto iter = input.begin()+1; iter!=input.end(); iter++){
for(int i =0 ;i<k; i++){
if(i == k_input.size()){
k_input.push_back(*iter);
break;
}else if(*iter < k_input.at(i)){
k_input.insert(k_input.begin()+i, *iter);
break;
}
}
if(k_input.size() > k) k_input.pop_back();
}
return k_input;
}
};