C++描述 LeetCode 665. 非递减数列

  

  大家好,我叫亓官劼(qí guān jié )


给你一个长度为 ​​n​​ 的整数数组,请你判断在 最多 改变 ​​1​​ 个元素的情况下,该数组能否变成一个非递减数列。

我们是这样定义一个非递减数列的: 对于数组中所有的 ​​i​​​ ​​(0 <= i <= n-2)​​​,总满足 ​​nums[i] <= nums[i + 1]​​。

示例 1:

输入: nums = [4,2,3]
输出: true
解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。

示例 2:

输入: nums = [4,2,1]
输出: false
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。

说明:

  • ​1 <= n <= 10 ^ 4​
  • ​- 10 ^ 5 <= nums[i] <= 10 ^ 5​

解题思路

题目要求最多改变一个数的情况下,判断能否变为非递减序列,则我们从头遍历序列,如果出现​​num[i] > nums[i+1]​​​,我们判断能否通过这次修改后,使得整个数列是非递减序列。修改一共有2种情况,第一种是​​nums[i]​​​太大导致的递减,所以我们修改​​nums[i] = nums[i+1];​​​第二种情况,nums[i+1]太小所导致的,我们修改:​​nums[i+1] = nums[i]​​​。如果这两种修改都无法使得修改后的数列是非递减序列,则无法通过一次修改将这个序列变为非递减序列。在第二次修改的时候记得复原​​nums[i]​​。

算法实现

class Solution {
public:
bool checkPossibility(vector<int>& nums) {
for(int i = 0 ; i < nums.size()-1; i++){
if(nums[i] > nums[i+1]){
// 当发现第一个num[i] > nums[i+1]时,设法让他成为非递减数列
int x = nums[i];
// 第一种情况,更改nums[i]
nums[i] = nums[i+1];
if(is_sorted(nums.begin(),nums.end()) )
return true;
nums[i] = x;//复原
// 第二种情况,更改nums[i+1]
nums[i+1] = x;
return is_sorted(nums.begin(),nums.end());
}
}
return true;
}
};