1次遍历,空间复杂度击败100%,时间复杂度击败85%

Problem: LCP 61. 气温变化趋势

  1. 思路
  2. 解题方法
  3. 复杂度
  4. Code

思路

一开始以为是【每日温度】那种题目,但是仔细读了下,实际上可以转换成另一个问题,即"比较两个数组的最长相同子序列"

假设我们用-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;

};
相关推荐
武子康1 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
文丑颜不良啊4 小时前
LeetCode2461~2480题目解析
java·leetcode
文丑颜不良啊5 小时前
LeetCode2441~2460题目解析
java·leetcode
文丑颜不良啊6 小时前
LeetCode2521~2540题目解析
java·leetcode
lisw057 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术8 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs9 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
自信150413057599 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
文丑颜不良啊9 小时前
LeetCode2501~2520题目解析
java·leetcode