###### tags: `Leetcode` `medium` `array` `python` `c++` # 665. Non-decreasing Array ## [題目連結:] https://leetcode.com/problems/non-decreasing-array/description/ ## 題目: Given an array ```nums``` with ```n``` integers, your task is to check if it could become non-decreasing by modifying **at most one element**. We define an array is non-decreasing if ```nums[i] <= nums[i + 1]``` holds for every ```i``` (**0-based**) such that (```0 <= i <= n - 2```). **Example 1:** ``` Input: nums = [4,2,3] Output: true Explanation: You could modify the first 4 to 1 to get a non-decreasing array. ``` **Example 2:** ``` Input: nums = [4,2,1] Output: false Explanation: You cannot get a non-decreasing array by modifying at most one element. ``` ## 解題想法: * 此題為最多更改一個數字,使得整個數列為non-decreasing升序 * 想法: * 考量當遍歷到nums[i],因為不知道未來nums[i+1]....等 * **考慮與nums[i-1]關係** * 對於nums[i-1]>nums[i]表示需要更改數字 * if i==1: * 因為不知道未來nums[i+1]與nums[i]大小關係,所以安全起見需更改nums[i-1]值: **nums[i-1]=nums[i]** * if nums[i-2]>nums[i]: * 表示i>1,則需要考慮到nums[i]與nums[i-1]、nums[i-2]關係 * 因為前面nums[i-2]與nums[i-1]關係一定是升序nums[i-2]<=nums[i-1]了,所以安全起見需更改nums[i]值,**nums[i]=nums[i-1]** ## Python: ``` python= class Solution(object): def checkPossibility(self, nums): """ :type nums: List[int] :rtype: bool """ #更改某數 使得數列為升序 #考量當遍歷到nums[i] 因為不知道未來nums[i+1]....等 #if i=1 :考慮與nums[i-1] #if i>1: 考慮與nums[i-1]、nums[i-2]關係 count=0 #計算更改次數 for i in range(1,len(nums)): if nums[i]<nums[i-1]: count+=1 if i==1 or nums[i-2]<=nums[i]: nums[i-1]=nums[i] #將nums[i-1]改成nums[i] elif i>1 and nums[i-2]>nums[i]: nums[i]=nums[i-1] #ex: 3 4 1 if count>1: return False return True nums = [4,2,3] result=Solution() ans=result.checkPossibility(nums) print(ans) ``` ## C++: ``` cpp= class Solution { public: bool checkPossibility(vector<int>& nums) { int count=0, n=nums.size(); if (n==1) return true; for (int i=1; i<n; i++){ if (nums[i-1]>nums[i]){ count+=1; if (count>1) return false; if (i==1 || nums[i-2]<=nums[i]) nums[i-1]=nums[i]; else nums[i]=nums[i-1]; } } return true; } }; ```