Leetcode665,执行20ms的范例值得深思

Leetcode665

思路

每次去掉数组中的一个元素,判断残数组是不是递增的,若是存在一个递增的残数组,则返回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;
}

但是,说实话,我没看太懂这个思路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章