学习目标:
- 数组中的第 K 个最大元素
leetcode原题链接
学习内容:
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
提示:
- 1 <= k <= nums.length <= 10^4
- -10^4 <= nums[i] <= 10^4
解题思路:
根据题意,最简单的方法就是通过调用js的sort方法对数组进行从大到小的排序,然后通过slice方法截取排序后数组的前k项,此时数组的k-1项就是答案。
var findKthLargest = function (nums, k) {
nums.sort((a, b) => b - a).slice(0, k)
return nums[k - 1]
};
如果不用原生js的sort方法,也可以通过快排来实现数组排序。
快速排序的思路就是分而治之
- 首先找到一个基准
- 之后,通过比较,把比基准大的数放右边,小的数放在基准左边
- 按照1和2继续拆分,直到找到下标
var findKthLargest = function (nums, k) {
quickSort(nums)
return nums[nums.length - k]
};
const quickSort = (arr) => {
quick(arr, 0, arr.length - 1)
}
const quick = (arr, left, right) => {
let index;
if (left < right) {
index = partition(arr, left, right)
if (left < index - 1) {
quick(arr, left, index - 1)
}
if (index < right) {
quick(arr, index, right)
}
}
}
// 找基准值
const partition = (arr, left, right) => {
let datum = arr[Math.floor(Math.random() * (right - left + 1) + left)]
let i = left;
let j = right;
while (i <= j) {
while (arr[i] < datum) {
i++
}
while (arr[j] > datum) {
j--
}
if (i <= j) {
[arr[i], arr[j]] = [arr[j], arr[i]]
i += 1
j -= 1
}
}
return i
}