zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    PHP全栈学习笔记3
    PHP全栈学习笔记3
    JavaScript基础系列
    JavaScript基础系列
    Java语言
    Java语言
    HTML基础系列
    HTML基础系列
    PHP全栈从入门到精通1
    PHP全栈从入门到精通1
  • 原文地址:https://www.cnblogs.com/zhiyin1209/p/12897342.html
Copyright © 2011-2022 走看看