100264. 最长的严格递增或递减子数组
给你一个整数数组 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
原站题解
golang 解法, 执行用时: 3 ms, 内存消耗: 2.5 MB, 提交时间: 2024-04-07 22:22:13
func longestMonotonicSubarray(a []int) int { ans := 1 i, n := 0, len(a) for i < n-1 { if a[i+1] == a[i] { i++ // 直接跳过 continue } i0 := i // 记录这一组的开始位置 inc := a[i+1] > a[i] // 定下基调:是严格递增还是严格递减 i += 2 // i 和 i+1 已经满足要求,从 i+2 开始判断 for i < n && a[i] != a[i-1] && a[i] > a[i-1] == inc { i++ } // 从 i0 到 i-1 是满足题目要求的(并且无法再延长的)子数组 ans = max(ans, i-i0) i-- } return ans }
java 解法, 执行用时: 0 ms, 内存消耗: 41.5 MB, 提交时间: 2024-04-07 22:21:58
class Solution { public int longestMonotonicSubarray(int[] a) { int ans = 1; int i = 0, n = a.length; while (i < n - 1) { if (a[i + 1] == a[i]) { i++; // 直接跳过 continue; } int i0 = i; // 记录这一组的开始位置 boolean inc = a[i + 1] > a[i]; // 定下基调:是严格递增还是严格递减 i += 2; // i 和 i+1 已经满足要求,从 i+2 开始判断 while (i < n && a[i] != a[i - 1] && (a[i] > a[i - 1]) == inc) { i++; } // 从 i0 到 i-1 是满足题目要求的(并且无法再延长的)子数组 ans = Math.max(ans, i - i0); i--; } return ans; } }
cpp 解法, 执行用时: 10 ms, 内存消耗: 26.2 MB, 提交时间: 2024-04-07 22:21:44
class Solution { public: int longestMonotonicSubarray(vector<int> &a) { int ans = 1; int i = 0, n = a.size(); while (i < n - 1) { if (a[i + 1] == a[i]) { i++; // 直接跳过 continue; } int i0 = i; // 记录这一组的开始位置 bool inc = a[i + 1] > a[i]; // 定下基调:是严格递增还是严格递减 i += 2; // i 和 i+1 已经满足要求,从 i+2 开始判断 while (i < n && a[i] != a[i - 1] && (a[i] > a[i - 1]) == inc) { i++; } // 从 i0 到 i-1 是满足题目要求的(并且无法再延长的)子数组 ans = max(ans, i - i0); i--; } return ans; } };
python3 解法, 执行用时: 37 ms, 内存消耗: 16.5 MB, 提交时间: 2024-04-07 22:21:21
class Solution: def longestMonotonicSubarray(self, a: List[int]) -> int: ans = 1 i, n = 0, len(a) while i < n - 1: if a[i + 1] == a[i]: i += 1 # 直接跳过 continue i0 = i # 记录这一组的开始位置 inc = a[i + 1] > a[i] # 定下基调:是严格递增还是严格递减 i += 2 # i 和 i+1 已经满足要求,从 i+2 开始判断 while i < n and a[i] != a[i - 1] and (a[i] > a[i - 1]) == inc: i += 1 # 从 i0 到 i-1 是满足题目要求的(并且无法再延长的)子数组 ans = max(ans, i - i0) i -= 1 return ans