总体思路:贪心算法,遇到递减时候,要么将前一个缩小要么将后一个放大。每次看三个元素,贪心体现在如果放大后一个则就放大到和前一个相等从而不影响后面的非递减,如果缩小前一个就缩小到和前前个相等,尽量不影响前一段的非递减。
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])// 修改方案1 这种情况既可以缩小前一个也可以放大后一个,但贪心选择缩小前一个更好。
nums[i] = nums[i + 1];
else // 修改方案2 这种情况只能放大后一个
nums[i + 1] = nums[i];
flag = false; // 用掉唯一的修改机会
}
else // 没有修改机会,直接结束
return false;
}
}
return true;
}
};
通过flag记录是否已经修改过一次