3349、检测相邻递增子数组 Ⅰ
3349、[简单] 检测相邻递增子数组 Ⅰ
1、题目描述
给你一个由 n
个整数组成的数组 nums
和一个整数 k
,请你确定是否存在 两个 相邻 且长度为 k
的 严格递增 子数组。具体来说,需要检查是否存在从下标 a
和 b
(a < b
) 开始的 两个 子数组,并满足下述全部条件:
- 这两个子数组
nums[a..a + k - 1]
和nums[b..b + k - 1]
都是 严格递增 的。 - 这两个子数组必须是 相邻的,即
b = a + k
。
如果可以找到这样的 两个 子数组,请返回 true
;否则返回 false
。
子数组 是数组中的一个连续 非空 的元素序列。
2、解题思路
要解决这个问题,我们需要检查数组 nums 中是否存在两个相邻的严格递增子数组,且每个子数组的长度为 k。因此,可以将问题分解为以下步骤:
- 检查递增子数组:我们先遍历 nums,找出从每个索引 i 开始的长度为 k 的子数组是否为严格递增。
- 相邻递增子数组检查:如果在遍历过程中找到了满足条件的相邻严格递增子数组,则返回 true。如果遍历结束没有找到,返回 false。
3、解题过程
- 从数组的每个索引 i 开始,检查
nums[i..i+k-1]
是否严格递增。 - 如果
nums[i..i+k-1]
和nums[i+k..i+2*k-1]
都是严格递增的,且满足两个子数组是相邻的,则返回true
。 - 如果遍历完毕没有找到满足条件的子数组,则返回
false
。
4、代码实现
class Solution {
public:
bool hasIncreasingSubarrays(vector<int>& nums, int k) {
int n = nums.size();
// 边界情况检查
if (n < 2 * k) {
return false;
}
// 遍历数组, 检查相邻的递增子数组
for (int i = 0; i <= n - 2 * k; ++i) {
bool firstIncreasing = true, secondIncreasing = true;
// 检查第一个长度为 k 的子数组是否严格递增
for (int j = i; j < i + k - 1; ++j) {
if (nums[j] >= nums[j + 1]) {
firstIncreasing = false;
break;
}
}
// 检查第二个长度为 k 的子数组是否严格递增
for (int j = i + k; j < i + 2 * k - 1; ++j) {
if (nums[j] >= nums[j + 1]) {
secondIncreasing = false;
break;
}
}
// 如果相邻的两个子数组都是严格递增的, 则返回 true
if (firstIncreasing && secondIncreasing) {
return true;
}
}
// 遍历完后仍未找到符合条件的子数组, 返回 false
return false;
}
};