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;

};
相关推荐
小蒋学算法10 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
荆棘鸟智能10 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
hhb_61811 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i11 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
苏打豆12 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
FluxArt12 小时前
GPT Image 2.5 中文提示词教程:Flux Art 可复用模板
前端·gpt·算法
思麟呀12 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法
阜阳山君GEO13 小时前
豆包 SEED 新版本 GEO 优化:信源金字塔、打分体系与避坑落地指南
人工智能·算法
晓天衡宇•评测社区13 小时前
晓天衡宇亮相 2026 云栖大会:迈向更可信的高质量评测
人工智能·算法·机器学习
CQU_JIAKE13 小时前
9.12[a]
算法