首页 > 编程语言 >2024.9.2 Python,用栈写每日温度,等差数列划分,子串所有可能性,等差数列划分,深度优先搜索解决累加数

2024.9.2 Python,用栈写每日温度,等差数列划分,子串所有可能性,等差数列划分,深度优先搜索解决累加数

时间:2024-09-02 20:24:13浏览次数:13  
标签:return nums Python res List int 划分 temperatures 等差数列

1.每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
***方法一:***暴力法,其中前向暴力法比较好想,但是还是比较麻烦的,可以考虑后向遍历,这样后向的经验就可以为前向服务,大概逻辑是,右边的数字如果比当前数字大,那就是1,如果比你小或者和你相等,那就找他指向的那个数字,不断循环直到找到比他大的那个数

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n=len(temperatures)
        res=[0]*n
        for i in range(n-1,-1,-1):
            if i==n-1:
                continue
            tmp=1
            while temperatures[i+tmp]<=temperatures[i]:
                if i+tmp==n-1:          #写这一条的目的是为了让找不到更大的值的有一个归宿
                    res[i]=0
                    break
                else:
                    if res[i+tmp]==0:
                        tmp+=1
                    else:
                        tmp+=res[i+tmp]
            if temperatures[i+tmp]>temperatures[i]:
                res[i]=tmp

        return res

这个是我写的代码,我的条件写的有点复杂,但是我也不知道怎么优化,我的逻辑基本上就是按照上面的思路进行编写的,同时对很多异常情况进行了额外的处理,也就是堆屎山,chat根据我的思路进行了一些优化:

from typing import List

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n = len(temperatures)
        res = [0] * n        
        for i in range(n - 2, -1, -1):  # 从倒数第二个元素开始遍历
            tmp = 1
            while i + tmp < n and temperatures[i + tmp] <= temperatures[i]:
                if res[i + tmp] == 0:  # 如果后面没有比当前温度高的
                    tmp = 0
                    break
                tmp += res[i + tmp]  # 否则跳到下一个更高温度的位置

            if tmp > 0:			#可以不加这个判断没有意义
                res[i] = tmp
        return res

chat的代码的逻辑确实会好一些,他的逻辑是这样的:
1.首先保证i+tmp在n内,如果后面的值小于等于当前值,那么就进入循环找下一个更大的值
2.特例,如果在下一个的最大的值已经是0的情况下,说明这种情况下tmp等于0
3.如果右边有更大的那就res[i+tmp]更新为现在的tmp
4.跑完循环以后出来,把tmp附给res就好了。这里的判断完全不需要的
方法二:用栈来写

from typing import List

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        n = len(temperatures)
        res = [0] * n
        stack = []

        for i in range(n - 1, -1, -1):
            while stack and temperatures[stack[-1]] <= temperatures[i]: #判断当前值和盘子里的最小值
                stack.pop() 				#如果大就扔盘子找下一个,直到找到他合适的位置
            if stack:													
                res[i] = stack[-1] - i									#盘子里还有就作差值算数字
            stack.append(i)									#当前值一定入盘子,因为一定能给他在栈里找到一个合适的位置存放
        return res

代码逻辑:
1.当i为n-1的时候,栈写进n-1
2.到n-2的时候,最后一个温度和当前温度比较,之后的温度小就进循环pop掉最后一个温度,然后res[i]=0,如果最后一个温度比他大,那么就不pop了,res[i]=1
3.之后的逻辑就是,进来一个数就先和栈里最小的先比较,如果比不上,那就结算,如果比最小的大,那就找栈里下一个,他的目标是把这个栈严格写成一个从大到小的顺序,如果当前数更大的,就把比这个数小的所有的盘子全部pop出去,下一次判断就以当前数为模板
具体的逻辑看我的注释,我是看明白了,但是这个代码也是那种,自己写很难写出来的逻辑,只能说看看热闹。如果有任何人有问题可以评论区留言,我将详细解答。

2.等差数列划分

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。
示例 1:
输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。
示例 2:
输入:nums = [1]
输出:0
***方法一:***暴力法

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        res=[]
        for left in range(0,len(nums)-2):
            right=left+2
            while right<len(nums):
                if self.check(nums[left:right+1]):
                    res.append(nums[left:right+1])#注意这里的加一,加一是为了取到right
                else:
                    break
        return res 
    
    def check(self,nums)->bool:
        if all(nums[i+1]-nums[i]==nums[i+2]-nums[i+1] for i in range(0,len(nums)-2)):
            return True
        else:
            return False

方法二差分 + 计数

from typing import List

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1:
            return 0
        
        d, t = nums[0] - nums[1], 0  # 初始化公差d,以及等差数列的计数器t
        ans = 0  # 最终结果,存储等差数列的数量
        
        # 从第3个元素开始遍历,因为等差数列至少有三个元素
        for i in range(2, n):
            if nums[i - 1] - nums[i] == d:  # 当前差值和之前差值d相等
                t += 1  # 当前元素与前两个元素构成新的等差数列,t增加
            else:
                d = nums[i - 1] - nums[i]  # 差值不相等,更新差值d
                t = 0  # t归零,因为无法继续形成等差数列
            ans += t  # 每次都将t的值加到最终结果中
        
        return ans

这个代码最巧的地方在于t+=1这里,我看这个代码的时候我心想这玩意加一有什么意义呢,每次发现一个新的元素,他要多好多子串呢,这咋能数的过来,但是其实很简单,比如三个元素的等差变四个元素的等差的时候就多了两种可能,四个元素变五个元素的时候就多了三种可能,是有规律的,所以这样遍历下来是合适的,只能说又是一个自己想是想不出来的题。还是暴力法来的直接。

3.累加数

累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。
给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。
说明:累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
示例 1:
输入:“112358”
输出:true
解释:累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
示例 2:
输入:“199100199”
输出:true
解释:累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
这个题我建议与上次那个ip地址配合食用,非常的好,详细请看我在9.1日写的文章

from typing import List

class Solution:
    def isAdditiveNumber(self, num: str) -> bool:
        # 将seg_count用来表示段数
        seg_count = len(num)  # 使用整个字符串长度来作为循环的控制

        def dfs(segId: int, segStart: int, segments: List[int]):
            # 如果找到了所有段并且遍历完了字符串
            if segId >= 3 and segStart == len(num):
                if self.check(segments[:segId]):
                    return True
                return False
            
            # 如果已经遍历完了字符串但是还没有足够的段
            if segStart == len(num):
                return False

            # 由于不能有前导零,如果当前数字为 0
            if num[segStart] == "0":
                segments[segId] = 0
                return dfs(segId + 1, segStart + 1, segments)
            
            addr = 0
            for segEnd in range(segStart, len(num)):
                addr = addr * 10 + int(num[segEnd])
                segments[segId] = addr
                if dfs(segId + 1, segEnd + 1, segments):
                    return True
                
            return False
        
        segments = [0] * seg_count
        return dfs(0, 0, segments)
        
    def check(self, nums: List[int]) -> bool:
        # 检查每两个数相加是否等于第三个数
        return all(nums[i] + nums[i + 1] == nums[i + 2] for i in range(len(nums) - 2))

这个代码是我根据昨天的代码修改而来的代码,这个代码的思路主要是dfs去遍历每种段,只要有一个是True,那就是True。看了下官方答案,这个题也是暴力法,我的方法未必不是好的,因为长度最多也就35个,所以这个题就是得用暴力法。

标签:return,nums,Python,res,List,int,划分,temperatures,等差数列
From: https://blog.csdn.net/RaidenMessi/article/details/141816501

相关文章

  • Python Web应用程序构建的最佳实践(代码实例与深度解析)
    在当今数字时代,构建高效、可扩展的Web应用程序是开发者们的一项重要任务。Python,作为一种简洁、强大的编程语言,为Web开发提供了丰富的工具和框架。在本篇文章中,我们将探讨使用Python构建Web应用程序的最佳实践,通过代码实例和深度解析来帮助你更好地理解和运用这些技术。1.选择合适......
  • python画三角函数图像tanx
    源码#开发者:a_blue_fat#日期:2024/8/14#时间:19:00#文件名称三角函数画图#开发者a_blue_fat#日期2024年8月9日importmathimportturtleastfrom三角函数得数importcos,sin,tant.setup(1000,800,0,0)#将画画点移动到指定位置写入需要标记数......
  • 【Python】企业排名、地域分布与词云分析可视化
    目录数据处理Pyecharts各国数量分布地图数量占比城市分布营业收入利润转化数据处理2021世界五百强企业数据,包含公司名称、公司链接、营业收入(百万美元)、利润(百万美元)、国家等信息。数据集下载:Python企业排名、地域分布与词云分析数据集资源-CSDN文库importnu......
  • 【Python机器学习】卷积神经网络(CNN)——语义理解
    无论是人类还是机器,理解隐藏在文字背后的意图,对于倾听者或阅读者来说的,都是一项重要的技能。除了理解单个词的含义,词之间还有各种各样巧妙的组合方式。词的性质和奥妙与词之间的关系密切相关。这种关系至少有两种表达方式:词序词的临近度这些关系的模式以及词本身存在的模式......
  • 在Python中如何执行语句?
    Python是一种高级编程语言,具有简洁、易读的语法结构,广泛应用于数据分析、机器学习、web开发、人工智能、游戏开发等领域。而在Python中,语句是构建程序的基本单元,通过语句来实现具体的功能操作,那么Python如何执行语句?具体请看下文。Python使用以下方法来执行语句:1、解......
  • 学习Python多久才能入门?
    转行学习编程,Python语言是大多数人的首要选择。因为它不仅在web开发、游戏开发、数据分析、网络爬虫等领域有着优异的表现,更是人工智能和机器学习的首选语言,那么学会Python大概需要多久?我们一起来看看吧。学习Python所需的时间取决个人的学习速度、学习目标和学习方式。......
  • 人员拥挤检测系统 Python
    人员拥挤检测系统通过Python网络模型算法技术,人员拥挤检测算法对校园/厂区/车间/港口/街道等场景的监控画面区域实现7X24小时全天候不间断进行自动分析监测,当人员拥挤检测算法监测到现场区域范围内,有异常的人群聚集(出现拥挤情况)时,人员拥挤检测算法会立刻抓拍存档并通知相关后台人员......
  • 一篇文章让你彻底掌握 Python,建议收藏!
    写在前面:如果你对Python感兴趣的话,可以试试我整理的这一份全套的Python学习资料,【点击这里】免费领取!目录解释器注释数据类型操作符算术运算符比较运算符赋值运算符位运算符逻辑运算符成员运算符身份运算符运算符优先级控制语句条件语句循环语句whilefor......
  • Python大数据之Hadoop学习——day07_Hive分区表和分桶表
    目录一.分区表一级分区多级分区分区操作hadoop_hive文档二.分桶表基础分桶表:分桶表排序:分区表和分桶表区别一.分区表分区表特点:需要产生分区目录,查询的时候使用分区字段筛选数据,避免全表扫描,替身查询效率 效率上:如果分区表,在查询数据的时候没有分区字段去筛......
  • Allen基因图谱:python Aabgen的安装
    1.abagen使用教程的官方链接:abagen:AtoolboxfortheAllenBrainAtlasgeneticsdata—abagen0.1.3-doc+0.g2aeab5b.dirtydocumentation2.在安装abagen之前先提前安装好一下的包window系统操作步骤:(1)安装好python(假如安装在E盘,E:\python\)(2)win+R打开任务管理器,输入......