LeetCode-665. 非遞減數列
阿新 • • 發佈:2018-12-14
題目描述
給定一個長度為 n
的整數陣列,你的任務是判斷在最多改變 1
個元素的情況下,該陣列能否變成一個非遞減數列。
我們是這樣定義一個非遞減數列的: 對於陣列中所有的 i
(1 <= i < n),滿足 array[i] <= array[i + 1]
。
示例 1:
輸入: [4,2,3]
輸出: True
解釋: 你可以通過把第一個4變成1來使得它成為一個非遞減數列。
示例 2:
輸入: [4,2,1]
輸出: False
解釋: 你不能在只改變一個元素的情況下將其變為非遞減數列。
說明: n
的範圍為 [1, 10,000]。
思路
觀察 1,2,8,5,6 和 1,5,8,2,6 兩個序列:當遇到第一次 nums[i] > nums[i+1] 時,需要判斷 nums[i+1] 和 nums[i-1] 的大小,若前者大於後者,則把 nums[i] 改為 nums[i-1] 或 nums[i+1] 均可,序列變為 1,2,2,5,6 或 1,2,5,5,6;反之,nums[i+1] 應變為 nums[i],即序列變為 1,5,8,8,6。此後,若還出現 nums[i] > nums[i+1],則該陣列不滿足題意。
程式碼
class Solution { public: bool checkPossibility(vector<int>& nums) { if(nums.size() == 0) return 0; if(nums.size() == 1) return true; int len = nums.size(); int flag = 0; //標記出現錯誤的次數 for(int i=0; i<len-1; i++){ if(nums[i] > nums[i+1]){ if(flag >= 1){ return false; } flag++; if(nums[i+1] < nums[i-1]){ nums[i+1] = nums[i]; } //else對後續判斷也沒有影響 } } return true; } };