Java 题解 | #第k轻的牛牛#

第k轻的牛牛

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param weights int整型一维数组
     * @param k int整型
     * @return int整型
     */
    public int findKthSmallest (int[] weights, int k) {
        int size_h = weights.length;
        int[] heap = new int[size_h + 1];

        for (int i = 1; i <= size_h; i++) {
            heap[i] = weights[i - 1];
        }

        for (int i = size_h / 2; i > 0; i--) {
            down(i, size_h, heap);
        }

        int n = size_h;
        int i = 0;

        while (n > 0) {
            weights[i++] = heap[1];
            heap[1] = heap[n--];
            down(1, n, heap);
        }

        return weights[weights.length - k];
    }

    private 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) {
            int temp = heap[u];
            heap[u] = heap[t];
            heap[t] = temp;
            down(t, s_h, heap);
        }
    }
    }

这段代码使用的编程语言是Java。

该题考察的知识点是堆排序和数组操作。

这段代码实现了一个函数 findKthSmallest,接受一个整数数组 weights 和一个整数 k 作为参数,并返回一个整数结果。

函数的目标是在给定的权重数组中找到第k小的元素。

代码中的主要逻辑如下:

  1. 首先创建一个堆数组 heap,长度为原始数组长度加1。创建一个变量 size_h 并赋值为原始数组的长度。
  2. 遍历原始数组,将元素复制到堆数组中。
  3. 使用循环从数组的中间位置开始,依次对每个非叶子节点进行向下调整,即调用 down 方法。
  4. 在 down 方法中,比较当前节点与其左右子节点的大小关系,如果需要交换,则进行交换,并继续向下调整。
  5. 调整完堆后,开始进行提取最小元素的操作。将堆顶元素(即根节点)复制到原始数组的相应位置,并将堆尾元素移动到堆顶。
  6. 对新的堆顶元素进行向下调整,即再次调用 down 方法。
  7. 重复步骤5和步骤6,直到堆中的元素全部提取完毕。
  8. 返回原始数组中倒数第k个元素作为结果。
全部评论

相关推荐

06-05 19:46
已编辑
武汉大学 后端
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务