题目来源: LeetCode 75 30 天 JavaScript 挑战
215. 数组中的第K个最大元素
思路
快速排序方法对数组分区,返回第 nums.length - k
个数
代码
js
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKthLargest = function(nums, k) {
const len = nums.length
const quick = (l, r) => {
if (l > r) {
return
}
let random = Math.floor(Math.random() * (r - l + 1)) + l
swap(nums, random, r)
let prvotIndex = partition(nums, l, r)
if (len - k < prvotIndex) {
quick(l, prvotIndex - 1)
} else {
quick(prvotIndex + 1, r)
}
}
quick(0, len - 1)
return nums[len - k]
};
function partition(nums, left, right) {
let pivot = nums[right]
let pivotIndex = left
for (let i = left; i < right; i++) {
if (nums[i] < pivot) {
swap(nums, i, pivotIndex)
pivotIndex++
}
}
swap(nums, right, pivotIndex)
return pivotIndex
}
function swap(nums, a, b) {
[nums[a], nums[b]] = [nums[b], nums[a]]
}
2336. 无限集中的最小数字
思路
使用一个数组记录被删除的元素,addBack
时判断 num
是否存在于数组中,如果有就删除。popSmallest
返回数组之外最小的数。
代码
js
class SmallestInfiniteSet {
data: Array<number>
constructor() {
this.data = []
}
popSmallest(): number {
let num = 0
let n = Infinity
for (let i = 1; i < n; i++) {
if (!this.data.includes(i)) {
this.data.push(i)
num = i
break
}
}
return num
}
addBack(num: number): void {
const idx = this.data.indexOf(num)
if (idx !== -1) {
this.data.splice(idx, 1)
}
}
}
2542. 最大子序列的分数
思路
将 nums1
和 nums2
组合起来,然后从大到小排序。使用一个优先队列,在 k
到 nums1.length
中比较,取大值。
代码
js
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number} k
* @return {number}
*/
const maxScore = function(nums1, nums2, k) {
let arr = [];
let len = nums1.length;
for(let i = 0; i < len; i++){
arr.push([nums1[i], nums2[i]]);
}
arr.sort((a,b) => b[1] - a[1]);
let sum = 0;
let heap = new MinPriorityQueue();
for (let i = 0; i < k; i++) {
heap.enqueue(arr[i][0]);
sum += arr[i][0];
}
let ans = sum * arr[k-1][1];
for (let i = k; i < len; i++) {
if (heap.front().element < arr[i][0]) {
sum = sum - heap.dequeue().element + arr[i][0];
heap.enqueue(arr[i][0]);
ans = Math.max(ans, sum * arr[i][1]);
}
}
return ans
};
本文完,感谢阅读。