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;

};
相关推荐
小O的算法实验室1 分钟前
ASOC,分层分数阶粒子群算法+无人机电场路径规划
算法
傅科摆 _ py4 分钟前
链表力扣复习
数据结构·leetcode·链表
重生之小比特10 分钟前
【算法拾光】二分查找|搜索插入位置 + x 的平方根
算法
智购科技自动售卖机厂家17 分钟前
双摄像头方案F1-score只有0.85,排查发现是上下视角的融合逻辑写反了~YH
python·单片机·嵌入式硬件·算法·eclipse
?abc!2 小时前
(动态规划+DFS)494. 目标和
算法·深度优先·动态规划
信奥卷王2 小时前
[GESP202406 六级] 二叉树(含视频)
数据结构·算法
惊鸿一博2 小时前
Plücker直线_ 用两个三维向量描述一条空间直线
线性代数·算法·直线·几何表示
小道士写程序3 小时前
Rust 中的字符串与切片(String 与 &str)
算法
圣保罗的大教堂3 小时前
leetcode 3863. 将一个字符串排序的最小操作次数 中等
leetcode
Tisfy3 小时前
LeetCode 3863.将一个字符串排序的最小操作次数:分类讨论(一次遍历)——简单易懂版
算法·leetcode·字符串·题解·分类讨论