题目:给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
这道题可以看做是找向下拐点的过程,如果向下拐点存在,那么你就需要作出改变数字的操作了
根据题意,非递减序列可以看做一个非单调的递增序列,那么我们改变向下拐点的方法也就有两种:
下移
上移
如何确定是哪一种,就需要向下拐点的前一个元素来帮忙了。
显然,如果在拐点前一位元素<拐点后一位元素时,选择向上移的方法就有可能存在拐点没有被消除的现象,而如果选择向下移,就可以完全避免这种情况:
如果前一位元素≥后一位元素,就只能采用上移才能保证向下拐点消除:
操作一次计数器增加1,当出现第二个向下拐点时,就说明改变一次是不行滴,返回false。
bool checkPossibility(int* nums, int numsSize){
int n=0,turn_i;
for(int j=0;j<numsSize;j++)
printf("nums[%d]=%d\n",j,nums[j]);
for(int i=0;i<numsSize-1;i++)
{
if(nums[i]>=nums[i+1])
{
nums[i+1]=nums[i];
n++;
}
}
printf("\n");
for(int j=0;j<numsSize;j++)
printf("nums[%d]=%d\n",j,nums[j]);
printf("n=%d",n);
if(n>1)
return false;
return true;
}