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