首页 > 编程语言 >13天【代码随想录算法训练营34期】 第五章 栈与队列part03(● 239. 滑动窗口最大值 ● 347.前 K 个高频元素)

13天【代码随想录算法训练营34期】 第五章 栈与队列part03(● 239. 滑动窗口最大值 ● 347.前 K 个高频元素)

时间:2024-04-01 11:11:23浏览次数:29  
标签:13 nums self 随想录 pop queue 347 result def

239. 滑动窗口最大值
单调队列:单调递减,一个queue,最大值在queue口,队列中只维护有可能为最大值的数字
比如说1,3,2,4;当sliding window已经到3时,就可以把1 pop出去了,因为有了3,1不可能为最大值,同理到4的时候,3、2都可以pop出去

class MyQueue:
    def __init__(self):
        self.queue = deque()
    def pop(self, value):
        if self.queue and value == self.queue[0]:
            self.queue.popleft()
    def push(self, value):
        while self.queue and value > self.queue[-1]:
            self.queue.pop()
        self.queue.append(value)
    def front(self):
        return self.queue[0]

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        q = MyQueue()
        result = []
        for i in range(k):
            q.push(nums[i])
        result.append(q.front())

        for i in range(k, len(nums)):
            q.pop(nums[i-k])
            q.push(nums[i])
            result.append(q.front())

        return result

347.前 K 个高频元素
先把数字和频率存进一个dictionary {key数字:value出现的次数}
大顶堆:root为最大数的tree
小顶堆:root为最小数的tree
如果找前k个最大的数,应该使用小顶堆,因为一般tree pop的都是root,用小顶堆的话,正好pop的就是最小值

import heapq
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        map_ = {}
        priority_q = []
        for i in range(len(nums)):
            if nums[i] in map_:
                map_[nums[i]] += 1
            else:
                map_[nums[i]] = 0
        for key, freq in map_.items():
            heapq.heappush(priority_q, (freq, key))
            if len(priority_q) > k:
                heapq.heappop(priority_q)
        
        result = [0] * k
        for i in range(k-1, -1, -1):
            result[i] = heapq.heappop(priority_q)[1]
        return result

标签:13,nums,self,随想录,pop,queue,347,result,def
From: https://www.cnblogs.com/miramira/p/18108005

相关文章

  • 11天【代码随想录算法训练营34期】 第五章 栈与队列part02(● 20. 有效的括号 ● 1047
    20.有效的括号classSolution:defisValid(self,s:str)->bool:stk=[]upper=["(","{","["]lower=[")","}","]"]dictionary={")":"(&qu......
  • 《自动机理论、语言和计算导论》阅读笔记:p115-p138
    《自动机理论、语言和计算导论》学习第6天,p115-p138总结,总计24页。一、技术总结1.associativityandcomutativity(1)commutativity(交换性):Commutativityisthepropertyofanoperatorthatsayswecanswitchtheorderofitsoperandsandgetthesameresult.......
  • [ABC347] AtCoder Beginner Contest 347 题解
    [ABC347]AtCoderBeginnerContest347题解A模拟。BSA模板,把所有子串丢进哈希表里即可。C逆天题,这个分讨并不显然。考虑计算所有天数到今天的偏移量,然后如果最远的和最近的天数的距离\(\leA\)肯定可以,否则可以把所有天向右平移一段距离,然后使得最远的天到达第二周的......
  • 代码随想录算法训练营第11天 | 栈和队列
    20.有效的括号遇到左括号入栈,遇到右括号弹出boolisValid(strings){ stack<char>kuohao; charc; for(chara:s){ switch(a) { case'(': case'{': case'[': kuohao.push(a); break; case')': case'......
  • 代码随想录第11天: 栈的应用
    20.有效的括号力扣题目链接(opensnewwindow)给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例1:输入:“()......
  • 代码随想录第10天:栈和队列基础操作
    语言:Java参考资料:代码随想录 232.用栈实现队列力扣题目链接(opensnewwindow)使用栈实现队列的下列操作:push(x)–将一个元素放入队列的尾部。pop()–从队列首部移除元素。peek()–返回队列首部的元素。empty()–返回队列是否为空。示例:MyQueuequeue......
  • AtCoder Beginner Contest 347 A-F 题解
    A-DivisibleQuesiton给你正整数\(N\)和\(K\),以及长度为\(N\)的序列\(A\)。提取\(A\)中所有是\(K\)倍数的元素,除以\(K\),并打印商。Solution判断\(A_i\%K\)的值是否为\(0\),如果非\(0\)则表示可以整除Code#include<bits/stdc++.h>usingnamespacest......
  • 代码随想录算法训练营第32天| 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏
    122.买卖股票的最佳时机II题目链接:买卖股票的最佳时机II题目描述:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出......
  • 代码随想录算法训练营第34天| 1005. K 次取反后最大化的数组和、134. 加油站、135. 分
    1005.K次取反后最大化的数组和题目链接:K次取反后最大化的数组和题目描述:给你一个整数数组nums和一个整数k,按以下方法修改该数组:选择某个下标i并将nums[i]替换为nums[i]。重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数......
  • 代码随想录算法训练营第36天| 435. 无重叠区间、763.划分字母区间、56. 合并区间
    435.无重叠区间题目链接:无重叠区间题目描述:给定一个区间的集合intervals,其中intervals[i]=[starti,endi]。返回需要移除区间的最小数量,使剩余区间互不重叠。解题思想:这道题目和射气球很像。*“需要移除区间的最小数量,使剩余区间互不重叠”*等效于求重叠区......