力扣每日一题 6/21 数组

  • 博客主页:誓则盟约
  • 系列专栏:IT竞赛 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍ 

LCP 61.气温变化趋势【简单

题目:

力扣城计划在两地设立「力扣嘉年华」的分会场,气象小组正在分析两地区的气温变化趋势,对于第 i ~ (i+1) 天的气温变化趋势,将根据以下规则判断:

  • 若第 i+1 天的气温 高于 第 i 天,为 上升 趋势
  • 若第 i+1 天的气温 等于 第 i 天,为 平稳 趋势
  • 若第 i+1 天的气温 低于 第 i 天,为 下降 趋势

已知 temperatureA[i] 和 temperatureB[i] 分别表示第 i 天两地区的气温。 组委会希望找到一段天数尽可能多,且两地气温变化趋势相同的时间举办嘉年华活动。请分析并返回两地气温变化趋势相同的最大连续天数

即最大的 n,使得第 i~i+n 天之间,两地气温变化趋势相同

示例 1:

输入: temperatureA = [21,18,18,18,31] temperatureB = [34,32,16,16,17]

输出:2

解释:如下表所示, 第 2~4 天两地气温变化趋势相同,且持续时间最长,因此返回 4-2=2。

示例 2:

输入: temperatureA = [5,10,16,-6,15,11,3] temperatureB = [16,22,23,23,25,3,-16]

输出:3

提示:

  • 2 <= temperatureA.length == temperatureB.length <= 1000
  • -20 <= temperatureA[i], temperatureB[i] <= 40

分析问题:

        这道题我们可以借助一个数组来标记这几天的温度变化趋势,根据题意,我们不难得出变化趋势是后一天与今天的温度相比,那么意思就是说最后一天不需要对比,所以只需要遍历从 0到len()-1 即可,那么我们开创的数组的长度也只需要len()-1即可。第一可以避免空间浪费,其次还可以避免把最后一位统计进去。这样我们即可进行以下的代码实现了。

代码实现:

class Solution:
    def temperatureTrend(self, temperatureA: List[int], temperatureB: List[int]) -> int:
        m=len(temperatureA)
        dp1=[0]*(m-1)
        dp2=[0]*(m-1)
        for i in range(m-1):
            if temperatureA[i+1]>temperatureA[i]:
                dp1[i]=1
            elif  temperatureA[i+1]==temperatureA[i]:
                dp1[i]=0
            else: dp1[i]=-1

            if temperatureB[i+1]>temperatureB[i]:
                dp2[i]=1
            elif temperatureB[i+1]==temperatureB[i]:
                dp2[i]=0
            else: dp2[i]=-1
        a_max,v=0,0
        for _ in range(m-1):
            if dp1[_]==dp2[_]:
                v+=1
            else:
                a_max=max(a_max,v)
                v=0
        a_max=max(a_max,v)
        return a_max


 

总结:

        题目总体不难,本来感觉复杂度可以的了,没想到竟然排最后了。还是可以优化优化的。以下是对代码详解以及考点总结。

详解

  1. 首先获取两个温度列表的长度 m 。
  2. 初始化两个辅助列表 dp1 和 dp2 ,长度均为 m - 1 。通过遍历两个温度列表,比较相邻元素的大小关系,分别将趋势(上升为 1 ,相等为 0 ,下降为 -1 )存储在 dp1 和 dp2 中。
  3. 然后通过一个循环,比较 dp1 和 dp2 中对应位置的趋势值。如果相同,则连续相同趋势的计数器 v 增加;如果不同,更新最大连续相同趋势长度 a_max ,并将计数器 v 重置为 0 。
  4. 循环结束后,再次更新最大连续相同趋势长度 a_max ,并返回其值。

考点

  1. 对列表的遍历和操作。
  2. 条件判断和逻辑处理。
  3. 动态规划的思想,通过记录中间状态(趋势值)来计算最终结果。
  4. 最大值的更新和连续相同值的计数。

 

“如果你的人生只有柠檬,不妨配盐喝点龙舌兰。 ”——《我是谁:没有绝对安全的系统》

  • 86
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 53
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值