难度标识:
⭐:简单,⭐⭐:中等,⭐⭐⭐:困难
。
tips:这里的难度不是根据LeetCode难度定义的,而是根据我解题之后体验到题目的复杂度定义的。
注,堆的题目我觉得用堆有点麻烦,而且复杂度提升感觉也不多,所以偷懒,直接排序,能提交通过就行。
1.数组中的第K个最大元素 ⭐
思路
直接排序返回。
代码
var findKthLargest = function (nums, k) {
return nums.sort((a, b) => b - a)[k - 1]
};
2.前 K 个高频元素 ⭐
思路
直接先拿一个对象统计一下每个元素出现的次数,然后根据次数从大到小排序,最后截取前k个元素即是高频元素。
代码
var topKFrequent = function (nums, k) {
const obj = {}
for (let num of nums) {
obj[num] = (obj[num] || 0) + 1
}
const sortObj = Object.entries(obj).sort((a, b) => b[1] - a[1])
return sortObj.slice(0, k).map(num => num[0])
};
3.数据流的中位数 ⭐
思路
这题排序的话直接使用sort过不了,时间超时,但是可以使用二分查找进行排序,是可以过的。
代码
var MedianFinder = function () {
this.data = []
};
MedianFinder.prototype.addNum = function (num) {
let left = 0, right = this.data.length - 1
while (left <= right) {
const mid = Math.floor((left + right) / 2)
if (this.data[mid] < num) {
left = mid + 1
} else {
right = mid - 1
}
}
this.data.splice(left, 0, num)
};
MedianFinder.prototype.findMedian = function () {
const n = this.data.length, mid = Math.floor(n / 2)
if (n % 2 === 1) {
return this.data[mid]
} else {
return (this.data[mid] + this.data[mid - 1]) / 2
}
};
堆的题目偷懒,直接就使用排序了,主打一个leetcode能过就行。