剑指Offer:29-最小的K个数

题目描述

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

思路

实现1-先预处理排序


class Solution {
public:
    vector GetLeastNumbers_Solution(vector input, int k) {
        int len = input.size();
        if(!len || k <= 0 || k > len)
            return vector();
        vector res;
        //排序就对了
        sort(input.begin(), input.end());
        for(int i = 0; i < k; i++)
            res.push_back(input[i]);
        return res;
    }
};

实现2-topK问题-堆

class Solution {
public:
    vector GetLeastNumbers_Solution(vector input, int k) {
        int len = input.size();
        if(!len || k <= 0 || k > len)
            return vector();
        //建立一个最大堆
        vector res(input.begin(), input.begin() + k);
        for(int i = k / 2 - 1; i >= 0; i--)
            adjustMaxHeap(res, i, k);
        //向堆中添加数据,并维护堆
        for(int i = k; i < len; i++)
            if(input[i] < res[0])
            {
                res[0] = input[i];
                adjustMaxHeap(res, 0, k);
            }
        return res;
    }
private:
    void adjustMaxHeap(vector& input, int pos, int len)
    {
        int tmp = input[pos];
        int child = pos * 2 + 1;
        while(child < len)
        {
            if(child + 1 < len && input[child+1] > input[child])
                child++;
            if(input[child] < tmp)
                break;
            else
            {
                input[pos] = input[child];
                pos = child;
                child = child * 2 + 1;
            }
            input[pos] = tmp;
        }
    }
};

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