bool isIncreasing(int* nums, int l, int r, int numsSize) {
for (int i = 1; i < numsSize; i++) {
if (i >= l && i <= r + 1) {
continue;
}
if (nums[i] <= nums[i - 1]) {
return false;
}
}
if (l - 1 >= 0 && r + 1 < numsSize && nums[r + 1] <= nums[l - 1]) {
return false;
}
return true;
}
int incremovableSubarrayCount(int* nums, int numsSize) {
int res = 0;
for (int i = 0; i < numsSize; i++) {
for (int j = i; j < numsSize; j++) {
if (isIncreasing(nums, i, j, numsSize)) {
res++;
}
}
}
return res;
}
这个题目看似简单,但其实我个人认为难度还是比较高的,下面我们就来详细了解一下这个代码。我们重点看一下bool isIncreasing这个函数。 首先我们来认识一下bool是什么,bool又称布尔类型,假如我们用布尔类型定义了一个函数,那么我们的返回值只能是ture或者false。好,知道这个知识点之后我们来进行下一步,假设我们的nums数组为[1,2,3,4],我们通过一个函数的嵌套,将数组里的每一个子数组都传输到bool isIncreasing进行比较。我们先看第一个语句 if (i >= l && i <= r + 1),continue。意思就是如果i在我们这个子数组的范围之内,那么我们就跳过这个循环,直接开始下一个循环,直到i不在我们的子数组范围之内。接下来,i不在我们的子数组范围之内了我们开始下一步的判断if (nums[i] <= nums[i - 1]),如果nums[i] <= nums[i - 1]说明去掉子数组的数组并不是一个递增的数组,返回false。下一步我们判断l-1和r+1有没有越界,并且判断末位的值是否大于首位,如果不是返回false,如果是返回true。当我们的if (isIncreasing(nums, i, j, numsSize))判断为真时res++,res在这里的作用便是统计移除递增子数组的数目,最后我们返回res。
好了这一题就讲解到这里了,其实做完之后会觉得难度还可以,也没有想象中的那么难,所以我们要多加练习。