题目描述
力扣城计划在两地设立「力扣嘉年华」的分会场,气象小组正在分析两地区的气温变化趋势,对于第
i ~ (i+1)
天的气温变化趋势,将根据以下规则判断:
- 若第
i+1
天的气温 高于 第i
天,为 上升 趋势- 若第
i+1
天的气温 等于 第i
天,为 平稳 趋势- 若第
i+1
天的气温 低于 第i
天,为 下降 趋势已知
temperatureA[i]
和temperatureB[i]
分别表示第i
天两地区的气温。 组委会希望找到一段天数尽可能多,且两地气温变化趋势相同的时间举办嘉年华活动。请分析并返回两地气温变化趋势相同的最大连续天数。即最大的
n
,使得第i~i+n
天之间,两地气温变化趋势相同
思路
使用i,j两个指针分别记录最大相同变化趋势序列的左右端点
如果当前当前遍历到的j+1与j下标处的元素大小相等或者具有相同的趋势,则移动右端点j
否则,表明当前序列已经不再连续了,需要记录此时序列的长度,并且将右端点右移,且令左端点的指向当前右端点
注:当遍历结束后,仍然需要判断一次j-i对应的序列是否为最长的
代码
class Solution {
public int flag(int a, int b) {
return a > b ? 1 : (a == b ? 0 : -1);
}
public int temperatureTrend(int[] temperatureA, int[] temperatureB) {
int n = temperatureA.length;
int i = 0, j = 0, res = 0;
int diffA = 0, diffB = 0;
while (j < n - 1) {
diffA = flag(temperatureA[j+1],temperatureA[j]);
diffB = flag(temperatureB[j+1],temperatureB[j]);
if ((diffA == 0 && diffB == 0) || (diffA * diffB > 0)){
j += 1;
} else {
res = Math.max(res,j-i);
j += 1;
i = j;
}
}
return Math.max(res,j-i);
}
}
class Solution:
def getNum(self,a,b):
if a > b:
return 1
elif a < b:
return -1
else:
return 0
def temperatureTrend(self, temperatureA: List[int], temperatureB: List[int]) -> int:
n,res = len(temperatureA),0
i,j = 0,0
while j < n - 1:
diffA = self.getNum(temperatureA[j+1],temperatureA[j])
diffB = self.getNum(temperatureB[j+1],temperatureB[j])
if (diffA == 0 and diffB == 0) or diffA * diffB > 0:
j += 1
else:
res = max(res,j - i)
j += 1
i = j
return max(res,j-i)