题解 | #第k轻的牛牛#
题目考察的知识点
- 排序算法:题目要求找到数组中第k小的元素,需要对数组进行排序。在这里,可以使用快速排序的分区算法进行优化,以实现时间复杂度为O(n)。
- 数组索引:题目要求返回第k小的元素,因此需要使用数组的索引操作来访问和返回特定位置上的元素。
题目解答方法的文字分析
解答方法主要使用了快速排序的分区算法,将数组不断划分为左右两个子数组,并确定一个基准值(pivot),将小于等于基准值的元素移动到左侧,大于基准值的元素移动到右侧。通过不断缩小搜索区间,找到第k小的元素。
具体流程如下:
- 确定初始搜索区间的左右边界,左边界为0,右边界为数组长度减1。
- 在每次迭代中,选择最右侧的元素作为基准值(pivot)。
- 使用两个指针(i和j),从左边界开始,依次比较元素与基准值的大小。
- 如果元素小于等于基准值,则将元素与指针i处的元素交换,并将指针i右移一位。
- 最后,将基准值与指针i处的元素交换,此时,基准值左侧的元素都小于等于它,右侧的元素都大于它。
- 如果k-1等于基准值的索引,说明已经找到第k小的元素,返回基准值。
- 如果k-1小于基准值的索引,说明第k小的元素在左侧,更新搜索区间的右边界为基准值的索引-1。
- 如果k-1大于基准值的索引,说明第k小的元素在右侧,更新搜索区间的左边界为基准值的索引+1。
- 重复上述步骤,直到搜索区间为空或找到第k小的元素。
本题解析所用的编程语言
本题的解析采用的编程语言是JavaScript。JavaScript是一种广泛应用于Web开发的脚本语言,它具有灵活且易于理解的语法,对于处理数组和索引操作非常方便,适合用来解决这个问题。
完整且正确的编程代码
function findKthSmallest(weights, k) {
if (k <= 0 || k > weights.length) {
return -1; // 错误处理,k超出范围
}
let left = 0;
let right = weights.length - 1;
while (left <= right) {
let pivotIndex = partition(weights, left, right);
if (k - 1 === pivotIndex) {
// 找到第k小的元素
return weights[pivotIndex];
} else if (k - 1 < pivotIndex) {
// 第k小的元素在左侧
right = pivotIndex - 1;
} else {
// 第k小的元素在右侧
left = pivotIndex + 1;
}
}
return -1; // 未找到第k小的元素,返回错误
}
// 使用快速排序的分区算法
function partition(arr, low, high) {
let pivot = arr[high];
let i = low;
for (let j = low; j < high; j++) {
if (arr[j] <= pivot) {
[arr[i], arr[j]] = [arr[j], arr[i]];
i++;
}
}
[arr[i], arr[high]] = [arr[high], arr[i]];
return i;
}
// 示例用法
let weights = [5, 8, 2, 7, 3, 9];
let k = 3;
let kthSmallest = findKthSmallest(weights, k);
console.log("第", k, "小的体重是:", kthSmallest);
题解 | 前端刷题 文章被收录于专栏
题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码


查看19道真题和解析