classSolution: defevalRPN(self, tokens: List[str]) -> int: stack = [] for i in tokens: if i == "+"or i == '-'or i == '*'or i == "/": a = stack.pop() b = stack.pop() if i == "+": stack.append(a+b) elif i == "-": stack.append(b-a) elif i == "*": stack.append(a*b) elif i == "/": stack.append(int(b/a)) # 向零取整用int(b/a)直接截断小数部分 else : stack.append(int(i)) return stack.pop()
classQueue : def__init__ (self): self.que = deque() defpop(self,value): #这里啥时候队列可能为空呢 ifself.que and value == self.que[0]:#队列不为空且遍历的值等于队口 self.que.popleft() #弹的是最大(对头在左) defpush(self,value): whileself.que and value > self.que[-1]: self.que.pop() self.que.append(value) defget(self): returnself.que[0]
classSolution: defmaxSlidingWindow(self, nums: List[int], k: int) -> List[int]: que = Queue() result = [] for i inrange(k): que.push(nums[i]) result.append(que.get()) for i inrange(k,len(nums)): que.pop(nums[i-k]) #例如加入第四个元素前要移除第一个 que.push(nums[i]) result.append(que.get()) return result
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
提示:
你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
你的算法的时间复杂度必须优于 $O(n \log n)$ , n 是数组的大小。
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。
你可以按任意顺序返回答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: deftopKFrequent(self, nums: List[int], k: int) -> List[int]: dir = {} for i inrange(len(nums)): dir[nums[i]] = dir.get(nums[i],0) + 1#key不存在就设为0,存在就加1 que = [] for key,value indir.items(): heapq.heappush(que,(value,key)) #注意value在前,因为按照value排序的 iflen(que) > k: heapq.heappop(que) result = [0] * k for i inrange(k-1,-1,-1): #第一个-1取不到所以就是0开始 result[i] = heapq.heappop(que)[1] return result
使用哈希表统计每个元素的频率,然后使用小顶堆维护前 k 个高频元素。 小顶堆的大小为 k,每次加入一个元素后,如果堆的大小超过 k,就弹出堆顶元素。 解释一下堆,就是完全二叉树,每个节点的左右子树都是堆,且根节点是堆顶。 小顶堆的性质是,堆顶元素是堆中最小的元素。 大顶堆的性质是,堆顶元素是堆中最大的元素。