剑指OFFER-最小的K个数

剑指OFFER-最小的K个数

  • Question
  • Solution
    • 暴力破解-sort
    • 最小数组sort

Question

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
关键词:数组 排序

Solution

这题主要考察排序,包括快排、归并等基本排序,最优解应该是最大堆排序(O(Nlog(k)))。

暴力破解-sort

时间复杂度:O(Nlog(N))
空间复杂度:O(1)

  • Python
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        tinput = sorted(tinput)
        if k<=len(tinput):
            return tinput[:k]
        else:
            return []
  • C++
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> ans;
        if(k==0 || k>input.size())
            return ans;
        sort(input.begin(), input.end());
        for(int i=0;i<k;i++)
            ans.push_back(input[i]);
         
        return ans;
    }
};

最小数组sort

时间复杂度:O(N·Klog(K))
空间复杂度:O(K)

  • Python
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        min_k = []
        if k==0 or k>len(tinput):
            return min_k
        for i in tinput:
            if len(min_k) < k:
                min_k.append(i)
            else:
                min_k = sorted(min_k)
                if i<min_k[-1]:
                    min_k[-1] = i
        return sorted(min_k)
  • C++
class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> ans;
        if(k==0 || k>input.size())
            return ans;
        
        for(int i=0;i<input.size();i++){
            if (ans.size()<k)
                ans.push_back(input[i]);
            else{
                sort(ans.begin(), ans.end());
                if(input[i] < ans[k-1])
                    ans[k-1] = input[i];
            }
        }
        sort(ans.begin(), ans.end());
        return ans;
    }

你可能感兴趣的:(剑指OFFER-最小的K个数)