思路
每次去掉数组中的一个元素,判断残数组是不是递增的,若是存在一个递增的残数组,则返回true,否则,返回false。
自己的代码
int isInc(int *nums, int numsSize, int index){
int ret = 1;
int* tmp = (int *)malloc(numsSize*sizeof(int));
int j=0;
for(int i=0;i<numsSize;i++){
if(i==index)continue;
tmp[j] = nums[i];
if(j>0){
if(tmp[j]<tmp[j-1]){
ret = 0;break;
}
}
j++;
}
free(tmp);
return ret;
}
bool checkPossibility(int* nums, int numsSize){
if(numsSize<3)return true;
bool ans = false;
int cnt = 0;
for(int i=0;i<numsSize;i++){
if(isInc(nums, numsSize, i)==1){
ans = true;
break;
}
}
return ans;
}
人家的代码
看了执行用时仅20ms的范例,真是妙啊。我第一个想法只是用了计算逆序对,但是这个条件不够,提交没有通过。然后就想了上面的方法。
bool checkPossibility(int* nums, int numsSize){
int count = 0, gap = 0;
for(int i = 0; i < numsSize - 1; i++){
if(nums[i] > nums[i+1])
count++;
if(i-1 >= 0 && i +1 <= numsSize -1 && nums[i-1] > nums[i+1])
gap++;
if(count >= 2 || gap >= 2)
return false;
}
return true;
}
但是,说实话,我没看太懂这个思路。