题解 | #第k轻的牛牛#

第k轻的牛牛

https://www.nowcoder.com/practice/7676478b46794456b145e8e48b0e2763

知识点:

排序/堆排序

分析:

可以使用快速排序,各种排序方法,这里使用堆排序

堆排序,重点理解:

i为什么从n/2开始down?

首先要明确要进行down操作时必须满足左儿子和右儿子已经是个堆。

开始创建堆的时候,元素是随机插入的,所以不能从根节点开始down,而是要找到满足下面三个性质的结点:

1.左右儿子满足堆的性质。

2.下标最大(因为要往上遍历)

3.不是叶结点(叶节点一定满足堆的性质)

编程语言:

C++

完整代码:

    void down(int u, int s_h, int* heap) {
        int t = u;
        if (2 * u <= s_h && heap[2 * u] > heap[t]) t = 2 * u;
        if (2 * u + 1 <= s_h && heap[2 * u + 1] > heap[t]) t = 2 * u + 1;
        if (u != t) {
            swap(heap[u], heap[t]);
            down(t, s_h, heap);
        }
    }
    void hsort(vector<int>& nums, int k) {
        int size_h = nums.size();
        int heap[size_h + 1];
        for (int i = 1; i <= size_h; i++) {
            heap[i] = nums[i - 1];
        }
        for (int i =  size_h / 2 ; i; i--) down(i, size_h, heap);
        int n = size_h;
        int i = 0;
        while (n--) {
            nums[i++] = heap[1];
            heap[1] = heap[size_h--];
            down(1, size_h, heap);
        }
    }
    int findKthSmallest(vector<int>& weights, int k) {
        hsort(weights,k);
        return weights[weights.size() - k];
    }

全部评论

相关推荐

今年会有offer吗:一眼代码相似度过高
投递华为等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务