day13代码随想录打卡

150

Debug: remember to return Math.ceil for negative number when doing devide

/**
 * @param {string[]} tokens
 * @return {number}
 */
var evalRPN = function(tokens) {
    const numbers = []
    for(let i = 0 ;i < tokens.length; i++){
        if(['+', '-', '*', '/'].includes(tokens[i])){
            let num1 = parseFloat(numbers.pop())
            let num2 = parseFloat(numbers.pop())
            let result
            if(tokens[i] == '*'){
                result = num1 * num2
            }else if(tokens[i] == '/'){
              	// better solution : num2/ num1 | 0
                result = (num2/ num1) > 0 ? Math.floor(num2 / num1) : Math.ceil(num2 / num1)
            }else if (tokens[i] == '-'){
                result = num2 - num1
            }else{
                result = num1 + num2
            }
            numbers.push(result)
        }else{
            numbers.push(tokens[i])
        }
    }
    return numbers.pop()
};

239

initial accept

其实是在O(n2) 里面做了一些简化运算而已,其实主要中心的操作和维护单调队列差不多

对比了一下执行时间更少一点,执行用时: 3132 ms

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    let maxValue = reCal(nums, 0, k)
    const res = [maxValue]
    for(let j = 1; j < nums.length - k + 1; j++){
        if(nums[j-1] == maxValue){
            maxValue = reCal(nums, j, j+k) //类比出栈
        }else if(nums[j+ k -1] > maxValue){
            maxValue = nums[j+ k -1] // 类比入栈
        }
        res.push(maxValue)
    }
    return res
};

var reCal = function(nums, start, end) {
    let maxValue = nums[start]
    for(let i = start; i < end ; i++){
        maxValue = maxValue > nums[i] ? maxValue : nums[i]
    }
    return maxValue
}

求前k个高频(大顶堆,小顶堆)

简单一点的想法就是dict + 根据values sort ,res push 一下key值

-> 维护k个集合

时间复杂度

排序 n lg(n)

只需要k个元素集合的排序 n lg(k)

k << n 会明显节省时间

需要好好研究一下大小顶堆的实现方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值