360筆試leetcode原題665

給定一個長度爲 n 的整數數組,你的任務是判斷在最多改變 1 個元素的情況下,該數組能否變成一個非遞減數列。

我們是這樣定義一個非遞減數列的: 對於數組中所有的 i (0<= i < n),滿足 array[i] <= array[i + 1]

 

 該題目屬於leetcode中easy的題目。首先,題目中要求令數組變成非遞減數列,即 array[i] <= array[i + 1]即可。我們可以通過設置一個計數器來判斷數組中呈遞減關係的元素個數。

同時需要注意的是,單純的上述方法並不能通過所有的用例,存在這樣的情況,-1,4,2,3.這樣的情況中,-1,4呈非遞減情況,2,3呈非遞減情況,用普通計數的方法不能準確的得出整個數組的情況。所以需要在判斷相鄰兩個元素關係的同時,判斷arr[i-2]的元素與arr[i]的一個關係。通過這樣關係的判斷,將數組中部分元素間修改爲非遞減的關係。即將arr[i]與arr[i-1]之間賦值關係的判斷。當arr[i-2]<arr[i-1]但arr[i-2]>arr[i]時,可以通過arr[i]=arr[i-1],令0~i部分呈非遞減形式。否則,令arr[i-1]=arr[i]可以令0~i部分呈非遞減形式。

具體代碼如下:

class Solution {
    public boolean checkPossibility(int[] nums) {
        int cnt=0;
        for(int i=1;i<nums.length;i++){
            if(nums[i]>=nums[i-1]){
                continue;
            }
            cnt++;
            if(i-2>=0 && nums[i-2]>=nums[i]){
                 nums[i]=nums[i-1];
            }else{
                nums[i-1]=nums[i];
            }
            
        }
        return cnt<=1;
    }
}

 

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