給定一個長度爲 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;
}
}