LeetCode热题100堆题解析

51 阅读1分钟

难度标识:⭐:简单,⭐⭐:中等,⭐⭐⭐:困难

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能过就行。