来源
详情
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
}
};
解析
这道题的本质就是寻找向下拐点的过程,如果存在,那么看能不能消除
改变拐点(nums[i] > nums[i + 1])的方法也就两种:要么将nums[i]缩小,要么将nums[i+1]放大
- 下移
- 上移
但是,问题是:
- 如果将nums[i]缩小,可能会导致无法融入前面已经遍历过的递减子序列
- 如果将nums[i + 1]放大,可能会导致后继的出现递减
所以,我们需要采用贪心策略,在遍历时,每次看连续三个元素nums[i - 1],nums[i],nums[i + 1],遵循如果两个原则:
- 尽可能不放大nums[i + 1],这样会让后继非递减更困难
- 如果缩小nums[i],但不破坏前面的子序列的非递减性;
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
if(nums.size() == 1){
return true;
}
bool flag = nums[0] < nums[1] ? true : false; //是否还能修改
//遍历时,连续看三个元素
for (int i = 1; i < nums.size() - 1; ++i) {
if(nums[i] > nums[i + 1]){ //出现递减
if(flag){ //还能修改
if(nums[i + 1] > nums[i - 1]){
nums[i] = nums[i + 1];
}else{
nums[i + 1] = nums[i];
}
flag = false;
}else{
return false;
}
}
}
return true;
}
};