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;
}

但是,說實話,我沒看太懂這個思路。

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