Problem: LCP 61. 气温变化趋势
思路
一开始以为是【每日温度】那种题目,但是仔细读了下,实际上可以转换成另一个问题,即"比较两个数组的最长相同子序列"
假设我们用-1、0、1分别表示当天比后一天小,当天和后一天相同,当天大于后一天。
则比如示例一可以变成这样:
css
trendA [ 1, 0, 0, -1 ]
trendB [ 1, 1, 0, -1 ]
那么对于这俩个转换后的数组,可以看到最长相同子序列就是这一部分

也就是正确答案:2
那么现在的问题就转变成了
如何统计最长相同子序列的长度?
由于子序列 对index有严格要求。
而不是子数组 ,假如是子数组,那么这题答案就是3了

因此针对子序列,我们只要用一次遍历,判断当前遍历index下的trendA[i]是否等于
trendB[i]
如果相等,则count++
如果不相等,则count重置为0,重新计数。并在此时比较一下ans和count
js
let count = 0;
let ans = 0;
for (let j = 0; j < trendA.length; j++) {
if (trendA[j] === trendB[j]) {
count++;
}
else {
ans = Math.max(ans, count)
count = 0;
}
}
ans = Math.max(ans, count)
return ans;
解题方法
然后我们考虑一下空间复杂度的优化,我们真的需要额外声明2个趋势数组去表示temperatureA和temperatureB,并且多一次遍历吗?
实际上并不需要。
我们可以用1次遍历和O(1)实现。
复杂度
时间复杂度:
O(n)
空间复杂度:
O(1)
Code
js
/**
* @param {number[]} temperatureA
* @param {number[]} temperatureB
* @return {number}
*/
var temperatureTrend = function (temperatureA, temperatureB) {
let count = 0;
let ans = 0;
for (let i = 0; i < temperatureA.length - 1; i++) {
let flagA;
let flagB;
if (temperatureA[i] < temperatureA[i + 1]) {
flagA = -1
}
if (temperatureA[i] === temperatureA[i + 1]) {
flagA = 0
}
if (temperatureA[i] > temperatureA[i + 1]) {
flagA = 1
}
if (temperatureB[i] < temperatureB[i + 1]) {
flagB = -1
}
if (temperatureB[i] === temperatureB[i + 1]) {
flagB = 0
}
if (temperatureB[i] > temperatureB[i + 1]) {
flagB = 1
}
if (flagA === flagB) {
count++;
}
else {
ans = Math.max(ans, count)
count = 0;
}
}
ans = Math.max(ans, count)
return ans;
};