给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。 示例 1: 输入: [4,2,3] 输入: [4,2,1] |
1 class Solution { 2 public: 3 bool checkPossibility(vector<int>& nums) { 4 int len=nums.size(); 5 int count=0; 6 // 数组个数小于2个 一定可以 7 if(len<3) return true; 8 // 思路如下: 9 // 如果出现 a[i] > a[i+1] 改变一个数 就面临两种选择 10 // 1. 把a[i]变大 11 // 2. 把a[i+1] 变小 12 // 这两种选择其实是有依据的 需要比较a[i-1] 与 a[i+1]的值 13 // eg. ... 1 4 3 ... 只能选择把4变小 ... 3 4 1 ... 只能选择把1变大 14 // 改变完之后,记录改变次数,再检测是否升序 15 // 如果次数大于1,至少改了两次 返回false 16 17 // 先让前两个有序 18 // 因为没有左边没有数 所以对于前两个数来说,最佳选择就是吧 a[0] 变小 19 if(nums[0]>nums[1]){ 20 nums[0] = nums[1]; 21 count+=1; 22 } 23 for(int i=1;i<len-1;i++){ 24 if(nums[i] > nums[i+1]){ 25 count +=1; 26 if(count > 1) return false; 27 if(nums[i-1] < nums[i+1]) nums[i]=nums[i-1]; 28 else nums[i+1]=nums[i]; 29 } 30 } 31 return true; 32 } 33 };