1. 程式人生 > >《劍指offer》——最小的K個數

《劍指offer》——最小的K個數

最小的K個數

題目:輸入n個整數,找出最小的K個數,例如輸入4,5,1,6,2,7,3,8,則輸出1,2,3,4。

一定要考慮邊界情況: - 陣列為空 - k大於陣列size - k小於0

思路一:最直接的想法,就是先對陣列排序,然後輸出前k個數。複雜度為 nlog(n)+n 。 快排

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。時間複雜度 O(nk) 。(該思想與氣泡排序思想類似)。

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;
    }
};