Leetcode 检测相邻递增子数组
3349. 检测相邻递增子数组 I
给你一个由 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 *
- <= nums[i] <=
思路
和下一题 检测相邻递增子数组 II 的思路一样,只需要判断 ans >= k
代码
class Solution {
public boolean hasIncreasingSubarrays(List<Integer> nums, int k) {
int ans = 0;
int preCnt = 0;
int cnt = 0;
for(int i = 0; i < nums.size(); i++){
cnt++;
if(i == nums.size()-1 || nums.get(i) >= nums.get(i+1)){
ans = Math.max(ans,Math.max(cnt /2, Math.min(preCnt,cnt)));
preCnt = cnt;
cnt = 0;
}
}
return ans >= k;
}
}
参考:. - 力扣(LeetCode)
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 *
- <= nums[i] <=
思路
最后的结果有两个选择,一是只有一个连续的子数组,子数组长度为 n,那么 k = n / 2。二是 有两个连续的子数组(就算有多个连续的子数组,每次也只看两个,只要最后覆盖了这多个连续的子数组即可),长度分别为 preCnt 和 cnt,那么此时 k = Math.min( preCnt, cnt)
代码
具体实现上有两个注意点,一是更新结果的时机:当遍历到末尾或者 nums.get(i) >= nums.get(i+1) 时,更新结果。二是更新结果时要注意 取 ans 与 Math.max(cnt/2, Math.min(cnt, preCnt )) 之间的较大值,保证最后可以返回最大的结果。
class Solution {
public int maxIncreasingSubarrays(List<Integer> nums) {
int ans = 0;
int preCnt = 0;
int cnt = 0;
for (int i = 0; i < nums.size(); i++) {
cnt++;
if (i == nums.size() - 1 || nums.get(i) >= nums.get(i + 1)) {
ans = Math.max(ans, Math.max(cnt / 2, Math.min(cnt, preCnt)));
preCnt = cnt;
cnt = 0;
}
}
return ans;
}
}
参考:. - 力扣(LeetCode)