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
总结:
题目总体不难,本来感觉复杂度可以的了,没想到竟然排最后了。还是可以优化优化的。以下是对代码详解以及考点总结。
详解:
- 首先获取两个温度列表的长度
m
。 - 初始化两个辅助列表
dp1
和dp2
,长度均为m - 1
。通过遍历两个温度列表,比较相邻元素的大小关系,分别将趋势(上升为1
,相等为0
,下降为-1
)存储在dp1
和dp2
中。 - 然后通过一个循环,比较
dp1
和dp2
中对应位置的趋势值。如果相同,则连续相同趋势的计数器v
增加;如果不同,更新最大连续相同趋势长度a_max
,并将计数器v
重置为0
。 - 循环结束后,再次更新最大连续相同趋势长度
a_max
,并返回其值。
考点:
- 对列表的遍历和操作。
- 条件判断和逻辑处理。
- 动态规划的思想,通过记录中间状态(趋势值)来计算最终结果。
- 最大值的更新和连续相同值的计数。