力扣每日一题 6/21 数组

简介: 力扣每日一题 6/21 数组

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

考点

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

 

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

相关文章
|
2天前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
6 1
|
2天前
|
存储 算法
力扣每日一题 6/20 数学+数组
力扣每日一题 6/20 数学+数组
5 1
|
2天前
|
缓存
力扣每日一题 6/14 动态规划+数组
力扣每日一题 6/14 动态规划+数组
6 1
|
16天前
|
C++ Python
二刷力扣--数组
二刷力扣--数组
|
17天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
20天前
|
存储 算法 数据可视化
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
|
20天前
|
存储 算法 数据可视化
|
20天前
|
存储 传感器 算法
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
|
2天前
|
算法 索引
力扣随机一题 位运算/滑动窗口/数组
力扣随机一题 位运算/滑动窗口/数组
10 0