LeetCode 703. 数据流中的第K大元素 JavaScript

27 篇文章 0 订阅
1 篇文章 0 订阅
/**
 * 通过
 * @param {number} k
 * @param {number[]} nums
 */
function swap(arr, i, j) {
    [arr[i], arr[j]] = [arr[j], arr[i]];
}

// 调整堆
function heapify(arr, len, i) {
    while (true) {
        if (i >= len) return;
        let leftChildIndex = 2 * i + 1;
        let rightChildIndex = 2 * i + 2;
        let max = i;
        if (leftChildIndex < len && arr[leftChildIndex] < arr[max]) {
            max = leftChildIndex;
        }
        if (rightChildIndex < len && arr[rightChildIndex] < arr[max]) {
            max = rightChildIndex;
        }
        if (max != i) {
            swap(arr, max, i);
            i = max;
        } else {
            return;
        }
    }
}

// 构建小顶堆
function buildHeap(arr, len) {
    let lastNodeIndex = len - 1;
    let lastNodeParentIndex = (lastNodeIndex - 1) >> 1;
    for (let i = lastNodeParentIndex; i >= 0; i--) {
        heapify(arr, len, i);
    }
}

var KthLargest = function (k, nums) {
    this.nums = nums.sort((a, b) => b - a);
    this.k = k;
    if (this.nums.length >= this.k) {
        this.nums.length = this.k;
        buildHeap(this.nums, this.nums.length);
    }
};

/** 
 * @param {number} val
 * @return {number}
 */
KthLargest.prototype.add = function (val) {
    if (this.nums.length < this.k) {
        this.nums.push(val);
        buildHeap(this.nums, this.nums.length);
        if (this.nums.length < this.k) {
            return undefined
        } else {
            return this.nums[0];
        }
    }
    if (val <= this.nums[0]) {
        return this.nums[0]
    }
    this.nums[0] = val;
    heapify(this.nums, this.nums.length, 0);
    return this.nums[0];
};

/**
 * Your KthLargest object will be instantiated and called as such:
 * var obj = new KthLargest(k, nums)
 * var param_1 = obj.add(val)
 */
// var k = 3;
// var arr = [4, 5, 8, 2];
// var kthLargest = new KthLargest(3, arr);
// console.log(kthLargest.add(3));   // returns 4
// console.log(kthLargest.add(5));   // returns 5
// console.log(kthLargest.add(10));  // returns 5
// console.log(kthLargest.add(9));   // returns 8
// console.log(kthLargest.add(4));   // returns 8

// var k = 1;
// var arr = [];
// var kthLargest = new KthLargest(k, arr);
// console.log(kthLargest.add(-3));   // returns -3
// console.log(kthLargest.add(-2));   // returns -2
// console.log(kthLargest.add(-4));  // returns -2
// console.log(kthLargest.add(0));   // returns 0
// console.log(kthLargest.add(4));   // returns 4

// var k = 2;
// var arr = [0];
// var kthLargest = new KthLargest(k, arr);
// console.log(kthLargest.add(-1));   // returns -1
// console.log(kthLargest.add(1));   // returns 0
// console.log(kthLargest.add(-2));  // returns 0
// console.log(kthLargest.add(-4));   // returns 0
// console.log(kthLargest.add(3));   // returns 1

// var k = 3;
// var arr = [5, -1];
// var kthLargest = new KthLargest(k, arr);
// console.log(kthLargest.add(2));   // returns -1
// console.log(kthLargest.add(1));   // returns 1
// console.log(kthLargest.add(-1));  // returns 1
// console.log(kthLargest.add(3));   // returns 2
// console.log(kthLargest.add(4));   // returns 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值