代码随想录算法训练营第12天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347. 前 K 个高频元素

在补在补了

打卡Day13

  • 1.150. 逆波兰表达式求值
  • 2.239. 滑动窗口最大值
  • 3.347. 前 K 个高频元素
  • 总结

1.150. 逆波兰表达式求值

题目链接:逆波兰表达式求值
文档讲解: 代码随想录

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """

        stack = []

        for i in tokens:
            if i not in {'+', '-', '*', '/'}:
                stack.append(i)
            else:
                num1 = int(stack.pop())
                num2 = int(stack.pop())
                if i == '+':
                    stack.append(num1 + num2)
                elif i == '-':
                    stack.append(num2 - num1)
                elif i == '*':
                    stack.append(num2 * num1)
                else:
                    stack.append(num2 // num1 if num1 * num2 > 0 else - (abs(num2) // abs(num1)))    
        return int(stack.pop())

两个注意点:
(1)弹出的元素要进行类型转换,因为存储的是字符,要转成整型
(2)进行整除操作的时候,要考虑到负数的情况;要用绝对值整除,再取负

可以调用内置函数

from operator import add, sub, mul

def div(x, y):
    # 使用整数除法的向零取整方式
    return int(x / y) if x * y > 0 else -(abs(x) // abs(y))

class Solution(object):
    op_map = {'+': add, '-': sub, '*': mul, '/': div}
    
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if token not in {'+', '-', '*', '/'}:
                stack.append(int(token))
            else:
                op2 = stack.pop()
                op1 = stack.pop()
                stack.append(self.op_map[token](op1, op2))  # 第一个出来的在运算符后面
        return stack.pop()

2.239. 滑动窗口最大值

题目链接:滑动窗口最大值
文档讲解: 代码随想录

思路:暴力求解过程中,遍历一遍的复杂度为O(n × m)。大顶堆(优先级队列)会改变队列元素的顺序,会导致弹出元素的时候出现问题。使用的单调队列只维护有可能成为窗口最大值的元素,同时保持队列里的元素数值是由大到小的,与优先级队列最大的区别是不改变队列中元素的顺序。

class MyQueue:
    #单调队列
    def __init__(self):
        self.queue = deque() #直接使用list会超时
    
    #检查要弹出的元素是否为队列出口元素的数值
    def pop(self, value):
        if self.queue and value == self.queue[0]:
            self.queue.popleft()
    
    #如果push的数值大于入口元素,就将队列后端的数值弹出,直到push的数值小于入口元素值
    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(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        que = MyQueue()
        result = []

        #先放前k个元素
        for i in nums[:k]:
            que.push(i)
        result.append(que.front())

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

3.347. 前 K 个高频元素

题目链接:前 K 个高频元素
文档讲解: 代码随想录

暴力解法

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """

        #统计出现频率
        time_dict = defaultdict(int)
        for i in nums:
            time_dict[i] += 1
        
        #定义字典,key为出现次数,value是对应的数字
        index_dict = defaultdict(list)
        for key in time_dict:
            #新字典将相同频率的数字放在同一个列表中
            index_dict[time_dict[key]].append(key)

        #升序
        key = list(index_dict.keys())
        key.sort()
        res = []
        count = 0

        #获取前k项
        # +=: 将右侧的可迭代对象中的元素追加到左侧的列表中
        while key and count != k:
            res += index_dict[key[-1]]
            count += len(index_dict[key[-1]])
            #移除列表最后一个元素
            key.pop()
        
        return res[:k]  
import heapq

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """

        #定义字典统计频率
        mapping = {}
        for i in range(len(nums)):
            mapping[nums[i]] = mapping.get(nums[i], 0) + 1

        #定义一个大小为k的小顶堆,对频率进行排序
        pri_que = []
        for key, freq in mapping.items():
            heapq.heappush(pri_que, (freq, key))
            if len(pri_que) > k:
                heapq.heappop(pri_que)

        #找出前k个高频元素,小顶堆先弹出最小的,所以要倒数输出数组
        res = [0] * k
        for i in range(k - 1, -1, -1):
            res[i] = heapq.heappop(pri_que)[1]
        return res

总结

在python中,栈的元素在内存中并不是连续分布的,其通常通过列表来实现,列表中的元素并不一定是连续分布的,是个动态数组,元素存储在堆内存中,并不要求连续的内存块。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/769342.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

E1696 无法打开 源 文件 “point.h“

一段时间没碰vs2022突然导入一个项目就出现下面错误 在网上查了很多办法,都没什么有用。 试了试,相对路径可以解决。 但是每次都要用相对路径太麻烦了。 又试了试,发现还是硬件问题,就像摩托长期不开等到突然想开的时候就死活打…

通信软件开发之业务知识:PON口割接什么意思?

一 PON口割接(原创总结) 在通信领域,PON口割接指的是对无源光网络(Passive Optical Network,PON)端口进行的切换或调整操作。简单来说,就是对光纤网络中的某个端口进行重新连接或重新分配&…

2024鸿翼加速推进数据要素生产力,“五驾马车”再启新鸿图

过去的2023年,在大家逐步走出3年疫情,对经济复苏的美好期待中,一路“高开低走”的市场态势,相信让许多的数字化从业者感受到了业务的沮丧和寒意。 但是,即便整个行业受经济大环境影响,鸿翼依旧逆势取得了连…

UE5 04-重新加载当前场景

给关卡加一个淡出的效果 给关卡加一个淡入的效果, 这个最好放置在Player 上,这样切关卡依然有这个效果

使用Charles实现Android抓包,附带Charles破解教程

1.下载Charles 网址:下载Charles 安装完成后的界面: 2.配置http抓包 点击该选项 可以看到代理的 ip 和端口号 然后在手机的wifi中配置代理(手机和电脑要在同一局域网),代理选择手动,并填入ip和端…

UE5 02-给物体一个扭矩力

需要注意的是: 1.弹簧臂 可以使用绝对旋转 这样就可以不跟随父物体Player的旋转 2.弹簧臂 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机会切换到碰撞点位置 进行碰撞测试勾选,当这个弹簧线被遮挡,摄像机不会切换到碰撞点位置

yolov8 目标检测快速streamlit可视化界面

参考: https://github.com/ultralytics/ultralytics/blob/2330caa50a8a8e0bb61408df8dca0721fb350dbe/ultralytics/solutions/streamlit_inference.py 版本: ultralytics 8.2.27 # Ultralytics YOLO 🚀, AGPL-3.0 licen…

买卖股票的最佳时期含冷冻期(leetcode)

个人主页:Lei宝啊 愿所有美好如期而遇 也就有这样的状态转移方程: 买入:dp[i][0] max(dp[i-1][1] - prices[i], dp[i-1][0]); 可买入:dp[i][1] max(dp[i-1][1], dp[i-1][2]); 冷冻期:dp[i][2] dp[i-1][0] prices…

mybatis、mybatis-plus插件开发,实现数据脱敏功能

首先说一下mybatis中四大组件的作用,下面开发的插件拦截器会使用 四大组件Executor、StatementHandler、ParameterHandler、ResultSetHandler Executor: Executor 是 MyBatis 中的执行器,负责 SQL 语句的执行工作。它通过调度 StatementHan…

在SpringBoot 3.0环境下创建一个SpringBoot 项目

一、环境配置 1.专业版的IDEA 版本号:尽量选择不要太老,不要太早 这里以2023.3.1为例。 官网:Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) 破解版:网上找资料哦!!&#…

【Python】基于动态规划和K聚类的彩色图片压缩算法

引言 当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红、绿、蓝三个分量组成。因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量。为了减少数据量,我们可以尝试减少颜色…

7.7、指针和函数

代码 #include <iostream> using namespace std;//实现两个数字进行交换 void swap01(int a, int b) {int temp a;a b;b temp;cout << "swap01a " << a << endl;cout << "swap01b " << b << endl; }void sw…

AUTOSAR NvM模块(七)

NvM工具配置demo 一切block的配置根据自己的需求&#xff01; NvMBlockDescriptor NvM Common MemIf General FeeBlockConfiguration FeeGeneral

Go语言学习:每日一练3

Go语言学习&#xff1a;每日一练3 目录 Go语言学习&#xff1a;每日一练3方法接口继承类型断言 方法 方法是一类有接收者参数的函数。 接收者的类型定义和方法的声明必须在一个包里 type MyInt intfunc (m MyInt) Add(add int) int {return int(m) add } //OR func (m *MyInt)…

苹果Mac电脑能玩什么游戏 Mac怎么运行Windows游戏

相对于Windows平台来说&#xff0c;Mac电脑可玩的游戏较少。虽然苹果设备的性能足以支持各种大型游戏&#xff0c;但由于系统以及苹果配套服务的限制&#xff0c;很多游戏无法在Mac系统中运行。不过&#xff0c;借助虚拟机软件&#xff0c;Mac电脑可以突破系统限制玩更多的游戏…

66.Python-web框架-Django-免费模板django-datta-able的分页的一种方式

目录 1.方案介绍 1.1实现效果 1.2django.core.paginator Paginator 类: Page 类: EmptyPage 和 PageNotAnInteger 异常: 1.3 templatetags 2.方案步骤 2.1创建一个common app 2.2创建plugins/_pagination.html 2.3 其他app的views.py查询方法 2.4在AIRecords.html里…

Unity中模拟抛物线(非Unity物理)

Unity中模拟抛物线非Unity物理 介绍剖析问题以及所需公式重力加速度公式&#xff1a;h 1/2*g*t*t(h 1/2 * g * t ^ 2)速度公式&#xff1a;Vt V初 a * t 主要代码总结 介绍 用Unity物理系统去做的抛物线想要控制速度或者想要细微的控制一些情况是非常困难的。所以想要脱离U…

Flutter——最详细(Drawer)使用教程

背景 应用左侧或右侧导航面板&#xff1b; 属性作用elevation相当于阴影的大小 import package:flutter/material.dart;class CustomDrawer extends StatelessWidget {const CustomDrawer({Key? key}) : super(key: key);overrideWidget build(BuildContext context) {return…

【Python】已解决ModuleNotFoundError: No module named ‘tensorflow‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决ModuleNotFoundError: No module named ‘tensorflow‘ 一、分析问题背景 ModuleNotFoundError: No module named ‘tensorflow’ 是一个常见的错误&#xff0c;通常在Pytho…

MATLAB常用语句总结7

MATLAB总结7&#xff1a;常见错误归纳 文章目录 MATLAB总结7&#xff1a;常见错误归纳前言一、rand 的使用二、蒙塔卡罗求解方法1.函数的定义2.函数引用 三、函数引用与多变量四、矩阵引用五、非线性函数&#xff1a;fmincon的使用六、线性规划函数1.linprog2.fminbnd、fminsea…