思路
每次去掉數組中的一個元素,判斷殘數組是不是遞增的,若是存在一個遞增的殘數組,則返回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;
}
但是,說實話,我沒看太懂這個思路。