列表

详情


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

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int longestMonotonicSubarray(vector<int>& nums) { } };

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

上一题