题目:
给你一个下标从 0 开始的 正 整数数组 nums
。
如果 nums
的一个子数组满足:移除这个子数组后剩余元素 严格递增 ,那么我们称这个子数组为 移除递增 子数组。比方说,[5, 3, 4, 6, 7]
中的 [3, 4]
是一个移除递增子数组,因为移除该子数组后,[5, 3, 4, 6, 7]
变为 [5, 6, 7]
,是严格递增的。
请你返回 nums
中 移除递增 子数组的总数目。注意 ,剩余元素为空的数组也视为是递增的。子数组 指的是一个数组中一段连续的元素序列。
示例 1:
输入:nums = [1,2,3,4]
输出:10
解释:10 个移除递增子数组分别为:[1], [2], [3], [4], [1,2], [2,3], [3,4], [1,2,3], [2,3,4] 和 [1,2,3,4]。移除任意一个子数组后,剩余元素都是递增的。注意,空数组不是移除递增子数组。
示例 2:
输入:nums = [6,5,7,8]
输出:7
解释:7 个移除递增子数组分别为:[5], [6], [5,7], [6,5], [5,7,8], [6,5,7] 和 [6,5,7,8] 。
nums 中只有这 7 个移除递增子数组。
提示:
1 <= nums.length <= 50
1 <= nums[i] <= 50
思路:
枚举 nums 中的每个子数组并判断是否为移除递增子数组。当枚举的子数组范围是 [l,r] 时,若满足如下条件则该子数组是移除递增子数组:
若 nums[l] 左侧有元素,并且这些元素满足严格递增;
若 nums[r] 右侧有元素,并且这些元素满足严格递增;
若 nums[l] 左侧有元素并且 nums[r] 右侧有元素,并且 nums[l]<nums[r+1]。
统计所有满足以上条件的子数组。
代码:
class Solution {
public:
int incremovableSubarrayCount(vector<int>& nums) {
int n = nums.size();
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (isIncreasing(nums, i, j)) {
res++;
}
}
}
return res;
}
bool isIncreasing(vector<int>& nums, int l, int r) {
for (int i = 1; i < nums.size(); i++) {
if (i >= l && i <= r + 1) {
continue;
}
if (nums[i] <= nums[i - 1]) {
return false;
}
}
if (l - 1 >= 0 && r + 1 < nums.size() && nums[r + 1] <= nums[l - 1]) {
return false;
}
return true;
}
};