3105.最长的严格递增或递减子数组:一次遍历

【LetMeFly】3105.最长的严格递增或递减子数组:一次遍历

力扣题目链接:https://leetcode.cn/problems/longest-strictly-increasing-or-strictly-decreasing-subarray/

给你一个整数数组 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

解题方法:一次遍历

一次遍历能否求出最长严格递增子数组?可以:

变量$cnt$记录当前连续递增长度,新遍历元素仍递增则长度加一,否则更新答案最大值并将长度置为1。

最长严格递减子数组同理,可以和最长递增子数组同时求解。

  • 时间复杂度$O(len(nums))$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
* @LastEditTime: 2026-11-12 13:15:11
*/
class Solution {
public:
int longestMonotonicSubarray(vector<int>& nums) {
int ans = 0;
int cntAsc = 1, cntDesc = 1;
size_t n = nums.size();
for (size_t i = 1; i <= n; i++) {
if (i == n || nums[i] <= nums[i - 1]) {
ans = max(ans, cntAsc);
cntAsc = 0;
}
cntAsc++;
if (i == n || nums[i] >= nums[i - 1]) {
ans = max(ans, cntDesc);
cntDesc = 0;
}
cntDesc++;
}
return ans;
}
};

End

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


3105.最长的严格递增或递减子数组:一次遍历
https://blog.letmefly.xyz/2026/11/12/LeetCode 3105.最长的严格递增或递减子数组/
作者
发布于
2026年11月12日
许可协议