LeetCode665非递减数列

106 阅读1分钟

🍀非递减数列

描述:

 # 给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
 ​
 我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
 ​
 示例 1:
 输入: nums = [4,2,3]
 输出: true
 解释: 你可以通过把第一个 4 变成 1 来使得它成为一个非递减数列。
 ​
 示例 2:
 输入: nums = [4,2,1]
 输出: false
 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
  
 提示:
 n == nums.length
 1 <= n <= 104
 -105 <= nums[i] <= 105

思考:

非递减最开始我理解的是只要不是递减就可以,也就是说可以存在等于的情况,只要存在比如3,1就需要把它变成非递减(这点想了很久才想明白)。所以接下来就判断递减,也就是前一个比后一个大的情况,这种情况肯定是需要改变后一个数的值,至于变大变小,要根据数组的情况来决定。

  1. i - 1 > i +1 && i > i + 1,在这种情况下为了使得序列尽可能的非递减,需要i + 1尽可能的小,把i给i + 1。

  2. i - 1 < i +1 && i > i + 1,在这种情况下为了使得序列尽可能的非递减,需要i尽可能的小。

    这个题费了好久的时间,算是最难的一个了到目前为止!

实现:

 public class Solution {
 ​
     public boolean checkPossibility(int[] nums){
 ​
         if (nums == null || nums.length == 1 || nums.length == 2){
             return true;
         }
 ​
         int change = 0;
 ​
         if (nums[0] > nums[1]){
             nums[0] = nums[1];
             change++;
         }
 ​
         for (int i = 1; i < nums.length - 1 && change < 2; i++) {
             if (nums[i] > nums[i + 1]){
                 change++;
                 if (nums[i - 1] > nums[i + 1]){ 
                     nums[i + 1] = nums[i];
                 }
             }
         }
 ​
         if (change > 1){
             return false;
         }else {
             return true;
         }
 ​
     }
 ​
 }

测试一下!

image.png