《剑指offer》面试题40. 最小的k个数

问题描述

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]
 

限制:

0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000

代码

直接进行排序,时间复杂度\(O(N\log(N))\)

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        sort(arr.begin(),arr.end());
        return vector<int> (arr.begin(),arr.begin()+k);
    }
};

结果

执行用时 :84 ms, 在所有 C++ 提交中击败了20.79%的用户
内存消耗 :19.1 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

用一个数组保存到目前为止最小的\(k\)个元素,时间复杂度\(O(kN)\)

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> ans(arr.begin(),arr.begin()+k);
        int i,j,n = arr.size();
        for(i = k; i < n; ++i)
        {
            int tmp = arr[i];
            for(j = 0; j < k; ++j)
            {
                if(ans[j] > tmp)
                {
                    swap(ans[j],tmp);
                }
            }
        }
        return ans;
    }
};

结果:

执行用时 :1004 ms, 在所有 C++ 提交中击败了5.00%的用户
内存消耗 :18.9 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        nth_element(arr.begin(), arr.begin()+k, arr.end());
        return vector<int>(arr.begin(), arr.begin()+k);
    }
};

结果:

执行用时 :48 ms, 在所有 C++ 提交中击败了56.42%的用户
内存消耗 :19.1 MB, 在所有 C++ 提交中击败了100.00%的用户

代码

class Solution {
public:
    vector<int> getLeastNumbers(vector<int>& arr, int k) {
        vector<int> ans;
        if(k == 0)return ans;
        priority_queue<int> q;
        int i = 0, n = arr.size();
        while(i < k)
            q.push(arr[i++]);
        while(i < n)
        {
            if(arr[i] < q.top())
            {
                q.pop();
                q.push(arr[i]);
            }
            ++i;
        }
        for(i = 0; i < k; ++i)
        {
            ans.push_back(q.top());
            q.pop();
        }
        return ans;
    }
};

结果:

执行用时 :112 ms, 在所有 C++ 提交中击败了14.01%的用户
内存消耗 :20 MB, 在所有 C++ 提交中击败了100.00%的用户
posted @ 2020-04-19 14:07  曲径通霄  阅读(138)  评论(0编辑  收藏  举报