LeetCode题解:703.数据流中的第K大元素

数据流中的第K大元素

一、LeetCode题解

瞧一瞧~

二、算法题

题目

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。

你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。

示例:

int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3);   // returns 4
kthLargest.add(5);   // returns 5
kthLargest.add(10);  // returns 5
kthLargest.add(9);   // returns 8
kthLargest.add(4);   // returns 8

解法一 (暴力比较)

思路
  • 思路待总结
代码
var KthLargest = function (k, nums) {
    this.data = nums
    this.k = k
    let len = this.data.length
    let parent = Math.floor((len - 2) / 2)
    this.shiftDown = function (k) {
        while (k * 2 + 1 < this.data.length) {
            let j = k * 2 + 1
            if (k * 2 + 2 < this.data.length && this.data[j] > this.data[j + 1]) {
                j += 1
            }
            if (this.data[k] > this.data[j]) {
                let m = this.data[k]
                this.data[k] = this.data[j]
                this.data[j] = m
                k = j
            } else {
                break
            }
        }
    }
    this.shiftUp = function (k) {
        while (k > 0) {
            let parent = Math.floor((k - 1) / 2)
            if (this.data[parent] > this.data[k]) {
                let m = this.data[k]
                this.data[k] = this.data[parent]
                this.data[parent] = m
                k = parent
            } else {
                break
            }
        }
    }
    this.extracMin = function () {
        this.data[0] = this.data[this.data.length - 1]
        this.data.pop()
        this.shiftDown(0)
    }
    for (parent; parent >= 0; parent--) {
        this.shiftDown(parent)
    }
    while (this.data.length > k) {
        this.extracMin()
    }
};
KthLargest.prototype.add = function (val) {
    if (this.data.length < this.k) {
        this.data.push(val)
        this.shiftUp(this.data.length - 1)
    } else {
        if (val > this.data[0]) {
            this.data[0] = val
            this.shiftDown(0)
        }

    }
    return this.data[0]
};
结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余光、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值