思路1 贪心

  • 时间复杂度 $O(n)$

  • 空间复杂度 $O(1)$

对于每个 i,需要让 nums[i] <= nums[i + 1],如果有 nums[i] > nums[i + 1],则要 modify

但是本题唯一的易错点就在这,

  • 如果将 nums[i] 缩小,可能会导致其无法融入前面已经遍历过的非递减子数列;

    3 4 2 3

    3 2 2 3

  • 如果将 nums[i + 1] 放大,可能会导致其后续的继续出现递减;

    3 4 2 3

    3 4 4 3

所以要采取贪心的策略,在遍历时,每次需要看连续的三个元素,也就是瞻前顾后,遵循以下两个原则:

  • 需要尽可能不放大 nums[i + 1],这样会让后续非递减更困难;

  • 如果缩小 nums[i],但不破坏前面的子序列的非递减性;

在遍历时,每次需要看连续的三个元素

遍历数组,如果遇到递减:

  • 还能修改:

    • 修改方案1:将nums[i]缩小至nums[i + 1];

    • 修改方案2:将nums[i + 1]放大至nums[i];

  • 不能修改了:直接返回false;

缩小时,必保证 nums[i-1] <= nums[i+1]。这样 nums[i] 变小后,也比前一个大

否则,则将后面的放大

Last updated

Was this helpful?