3350.检测相邻递增子数组II

目标

给你一个由 n 个整数组成的数组 nums ,请你找出 k 的 最大值,使得存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,并满足下述全部条件:

  • 这两个子数组 nums[a..a + k - 1] 和 nums[b..b + k - 1] 都是 严格递增 的。
  • 这两个子数组必须是 相邻的,即 b = a + k。

返回 k 的 最大可能 值。

子数组 是数组中的一个连续 非空 的元素序列。

示例 1:

输入:nums = [2,5,7,8,9,2,3,4,3,1]
输出:3
解释:
从下标 2 开始的子数组是 [7, 8, 9],它是严格递增的。
从下标 5 开始的子数组是 [2, 3, 4],它也是严格递增的。
这两个子数组是相邻的,因此 3 是满足题目条件的 最大 k 值。

示例 2:

输入:nums = [1,2,3,4,4,4,4,5,6,7]
输出:2
解释:
从下标 0 开始的子数组是 [1, 2],它是严格递增的。
从下标 2 开始的子数组是 [3, 4],它也是严格递增的。
这两个子数组是相邻的,因此 2 是满足题目条件的 最大 k 值。

说明:

  • 2 <= nums.length <= 2 * 10^5
  • -10^9 <= nums[i] <= 10^9

思路

从数组中找出两个相邻的长度相同的严格递增子数组,求子数组的最大长度。

3349.检测相邻递增子数组I 相比,本题求的是满足条件的最大 k 值。上一题使用动态规划记录以当前元素结尾的严格递增子数组的长度,可以取两个相邻递增子数组的最后一个 dp 值,前一个记为 prev,后一个记为 cur。那么最大的长度为 Math.max(cur / 2, Math.min(prev, cur)),即将当前的 cur 拆分为两个递增子数组,或者取 prevcur 的最小值。可以进行空间优化,仅使用两个变量即可。

代码


/**
 * @date 2025-10-15 8:45
 */
public class MaxIncreasingSubarrays3350 {

    public int maxIncreasingSubarrays(List<Integer> nums) {
        int n = nums.size();
        int cur = 1;
        int prev = 0;
        int res = 1;
        for (int i = 1; i < n; i++) {
            if (nums.get(i) > nums.get(i - 1)) {
                cur++;
                res = Math.max(res, Math.max(cur / 2, Math.min(prev, cur)));
            } else {
                prev = cur;
                cur = 1;
            }
        }
        return res;
    }
}

性能

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注