665. 非递减数列『简单』

题目来源于力扣(LeetCode

一、题目

665. 非递减数列

题目相关标签:数组

说明:

  • 1 <= n <= 10 ^ 4
  • - 10 ^ 5 <= nums[i] <= 10 ^ 5

二、解题思路

  1. 因可以改变一次数组元素的值,那么定义一个变量用来记录改变元素的次数,大于 1 次时即返回 false

  2. 遍历数组,判断当前遍历元素是否小于前一个元素

  3. 小于前一个元素时,还需要判断是否小于前二个元素

  4. 如果小于前一个且小于前二个元素时,那么只能将当前元素改变为前一个元素的值,改变次数的变量加 1

  5. 如果当前遍历元素仅小于前一个元素且大于等于前二个元素时,那么改变前一个元素的值为当前元素的值

三、代码实现

public static boolean checkPossibility(int[] nums) {
    // 定义变量记录改变元素的次数
    int changeCount = 0;
    for (int i = 1; i < nums.length; i++) {
        // 当前遍历元素小于之前的元素时,非递增的情况
        if (nums[i] - nums[i - 1] < 0) {
            // 当前元素不仅小于前面一个元素,且小于前面的第二个元素时,则需要改变当前元素为大值(即前一个元素的值)
            // 比如:{3, 4, 2, 3},需要将 2 换成 4,如果将 4 换成 2,则 2 < 3,不满足非递减规则
            // i > 1,当前遍历元素不为第 2 位时,否则无法获取到前二位元素
            if (i > 1 && (nums[i] - nums[i - 2] < 0)) {
                nums[i] = nums[i - 1];
            } else {
                // 普通情况下将当前元素的前一个较大元素改变成当前元素
                // 比如:{4, 2, 3},将 4 换成 2
                nums[i - 1] = nums[i];
            }
            changeCount ++;
        }
        // 改变次数大于 1 次时,返回 false
        if (changeCount > 1) {
            return false;
        }
    }
    return true;
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
    boolean nums = {4, 2, 3};  // output:true
//    boolean nums = {4, 2, 1};  // output:false
//    boolean nums = {3, 4, 2, 3};  // output:false;
    boolean result = checkPossibility(nums);
    System.out.println(result);
}
posted @ 2020-05-15 21:41  知音12138  阅读(195)  评论(0编辑  收藏  举报