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 会明显节省时间
需要好好研究一下大小顶堆的实现方式