2-剑指offer: 最小的K个数

题目描述

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

代码:

// 这种topN问题比较常见的是使用堆来解决,最小的k个数就采用最大堆,最大的k个数就采用最小堆.
// 此外任然可以用快排来解决.

class Solution {
public:
    int Partition(vector<int> &input, int left, int right) {
        if (left > right)
            return left;
        int key = input[left];
        int i = left;
        int j = right;
        while(i<j) {
            // 从右往左遍历
            while (i < j && input[j] >= key) {
                j--;
            }
            
            // 交换
            if (i < j) {
                input[i] = input[j];
                i++;
            }
            
            // 从左往右遍历
            while(i<j && input[i] <= key) {
                i++;
            }
            
            // 交换
            if (i<j) {
                input[j] = input[i];
                j--;
            }
        }
        input[i] = key;
        return i;
    }

    void QuickSort(vector<int> &input, int k, int left, int right) {
        if (left >= right) return;
        int mid = Partition(input, left, right);
        if (mid == k-1) return;
        else if(mid > k-1) QuickSort(input, k, left, mid-1);
        else if (mid < k-1) QuickSort(input, k, mid+1, right);
    } 
    
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        vector<int> res;
        if ((size_t)k > input.size())
            return res;
        else{
            QuickSort(input, k, 0, input.size()-1);
            res.insert(res.end(), input.begin(), input.begin()+k);
        }
        return res;
    }
};

只是快排是能够解决这个问题的,不过这里对快排进行了一点更改,减小了时间复杂度.

原文地址:https://www.cnblogs.com/xl2432/p/10864146.html