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个元素作为结果。

阿里云成长空间 763人发布