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