LeetCode 3105.最长的严格递增或递减子数组

给你一个整数数组 nums 。

返回数组 nums 中 严格递增 或 严格递减的最长非空子数组的长度。

示例 1:

**输入:**nums = 1,4,3,3,2

**输出:**2

解释:

nums 中严格递增的子数组有[1]、[2]、[3]、[3]、[4] 以及 [1,4] 。

nums 中严格递减的子数组有[1]、[2]、[3]、[3]、[4]、[3,2] 以及 [4,3] 。

因此,返回 2 。

示例 2:

**输入:**nums = 3,3,3,3

**输出:**1

解释:

nums 中严格递增的子数组有 [3]、[3]、[3] 以及 [3] 。

nums 中严格递减的子数组有 [3]、[3]、[3] 以及 [3] 。

因此,返回 1 。

示例 3:

**输入:**nums = 3,2,1

**输出:**3

解释:

nums 中严格递增的子数组有 [3]、[2] 以及 [1] 。

nums 中严格递减的子数组有 [3]、[2]、[1]、[3,2]、[2,1] 以及 [3,2,1] 。

因此,返回 3 。

提示:

  • 1 <= nums.length <= 50
  • 1 <= nums[i] <= 50

分组循环,严格递增或严格递减的为一组,找最长的组:

cpp 复制代码
class Solution {
public:
    int longestMonotonicSubarray(vector<int>& nums) {
        int n = nums.size();

        int ans = 0;

        int i = 0;
        while (i < n) {
            int start = i;
            ++i;
            while (i < n && (nums[i] - nums[i - 1]) * (nums[start + 1] - nums[start]) > 0) {
                ++i;
            }

            ans = max(ans, i - start);

            // 循环结束时,[start, i - 1]是严格递增或递减的
            // 下次循环从i - 1位置开始
            if (i < n && nums[i] != nums[i - 1]) {
                --i;
            }
        }

        return ans;
    }
};

如果nums的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。

相关推荐
飞Link1 小时前
什么是 PX4?一文了解 PX4 在空地协同中的作用
算法·无人机
一去不复返的通信er8 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
考研保研资料分享9 小时前
985工科跨保上财应用统计:数学笔试、匿名面试与机试复盘
面试·职场和发展
程序 代码狂人10 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade11 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
Xin77012 小时前
LeetCode 79. 单词搜索(DFS 回溯法)
leetcode
小郎君65813 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一14 小时前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS10014 小时前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法