题目要求
给定一个序列,改动其中的数字,能够构成非递减序列所更改次数少于2的函数返回真,否则返回假。
思路
首先考虑数组数量少于等于2的时候一定可以构成非递减序列
当大于等于3时需要,遇到当前的值大于后面的一个值说明这时候需要进行修改,修改有两种情况,将当前的值设置成前面的值,或者是设置成后面的值。
1.设置成前面的值
后面的值大于前面值的时候,设置当前的值为前面的值可以保证非递减序列。
2.设置成后面的值
后面的值小于前面值的时候,设置当前的值为后面的值可以保证非递减序列。
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int sum = 0;
if(nums.size()<=2) return true;
if(nums[0]>nums[1])
{
sum++;
nums[0] = nums[1];
}
for(int i = 1;i<nums.size()-1;i++)
{
// 如果大了必然得改
if(nums[i]>nums[i+1])
{
if(nums[i+1]>nums[i-1])
{
nums[i] = nums[i-1];
}
if(nums[i+1]<nums[i-1])
{
nums[i+1] = nums[i];
}
sum++;
}
}
if(sum>1)
{
return false;
}
return true;
}
};