运行时间:3ms
占用内存:544KB

使用最大堆解决 第 TopK 问题

class Solution {
public:
    // 第 K 大使用最大堆
    void MAX_HEAPIFY(std::vector<int> &arr, int begin, int end) {
        int l       = begin * 2 + 1;
        int r       = begin * 2 + 2;
        int largest = begin;
        if(l <= end && arr[l] > arr[largest]) largest = l;
        if(r <= end && arr[r] > arr[largest]) largest = r;
        if(largest != begin) {
            std::swap(arr[begin], arr[largest]);
            MAX_HEAPIFY(arr, largest, end);
        }
    }
    int findKth(vector<int> a, int n, int K) {
        // 构建堆
        for(int i = a.size() / 2 - 1; i >= 0; --i) MAX_HEAPIFY(a, i, a.size() - 1);
        for(;K>1;--K){
            a[0] = a[a.size() - 1];
            a.pop_back();
            MAX_HEAPIFY(a, 0, a.size() - 1);
        }
        return a[0];
    }
};

这个算法算是我刷题到现在写的最长的一个了。。。总是细节出问题,气的我甚至用 gtest 本地一个一个函数过的。

一次是 MAX_HEAPIFY(a, i, a.size() - 1) 中的 i 写成了 0,结果导致建堆没建完整

一次是 a[0] = a[a.size() - 1] 写的 a[0] = *a.end() 。结果卡在了第 19 个测试上

一次是 K>1 写成了 K>0 ,卡在了第 14 个测试上

不过看到它 ac 100% 还是很开心。尽管内存占用有些大。。。但是没有用标准库中的 sort 和 make_heap。算是没有投机取巧