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)。

相关推荐
AI软著研究员40 分钟前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱2 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者18 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮18 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者19 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考19 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法