Leetcode每日一练--44
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-109 <= nums[i] <= 10^9
代码
int maxIncreasingSubarrays(int* nums, int numsSize) {// 预处理左侧递增序列长度:left_inc[i]表示以i结尾的连续递增长度int* left_inc = (int*)malloc(numsSize * sizeof(int));left_inc[0] = 1;for (int i = 1; i < numsSize; i++) {if (nums[i] > nums[i - 1]) {left_inc[i] = left_inc[i - 1] + 1;} else {left_inc[i] = 1;}}// 预处理右侧递增序列长度:right_inc[i]表示从i开始的最长连续递增长度int* right_inc = (int*)malloc(numsSize * sizeof(int));right_inc[numsSize - 1] = 1;for (int i = numsSize - 2; i >= 0; i--) {if (nums[i] < nums[i + 1]) {right_inc[i] = right_inc[i + 1] + 1;} else {right_inc[i] = 1;}}int ans = 0;// 遍历所有可能的分界点(第一个子数组的结束位置)for (int i = 0; i < numsSize - 1; i++) {int k_candidate = left_inc[i] < right_inc[i + 1] ? left_inc[i] : right_inc[i + 1];if (k_candidate > ans) {ans = k_candidate;}}free(left_inc);free(right_inc);return ans;
}
