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