1,题目要求
Given an array with n integers, your task is to check if it could become non-decreasing by modifying at most 1 element.
We define an array is non-decreasing if array[i] <= array[i + 1] holds for every i (1 <= i < n).
给定一个数组,能否仅仅更改不超过一个数字,让整个数组称为非递减的顺序。
2,题目思路
一开始,思路是逐次判断相邻数字的大小情况,有超过两个不满足的情况,就返回false,否则就返回true。但是,这样做是不够的,例如:3,4,2,3这种情况。
因此,在进行比较的过程中,不仅要进行比较,还要对数字进行修改;而且在修改过程中,也不能仅仅局限在相邻的两个数字,num[i-2]和num[i]的值的大小也要进行比较。
假如三个数字的大小是:小,大大,大的形式,则仅仅把num[i-1]的值更改:num[i-1] = num[i]
假如三个数字的大小是:大,大大,小的形式,则此时要对num[i]进行更改:num[i] = num[i-1]
这样,从头开始,就可以避免3,4,2赋值后仍然不是非递减次序的情况。
3,程序源码
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int res = 0;
for(int i = 1;i<nums.size() && res<=1;i++)
{
if(nums[i]<nums[i-1])
{
res++;
if(i-2<0 || nums[i] >= nums[i-2]) nums[i-1] = nums[i];
else nums[i] = nums[i-1];
}
}
return res<=1;
}
};