zoukankan      html  css  js  c++  java
  • Leetcode 665 非递减数列

    题目定义:

    给你一个长度为 n 的整数数组,请你判断在 最多 改变 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
    解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
    

    思路:

    • 思路: 定义两个指针 right:指向当前需要遍历的元素; pre:指向前一个已经遍历的元素

    • 数据类型考虑三种情况 : [4,2,3],[1,4,2,3],[3,4,2,3] 且都存在 nums[pre] < nums[right]

      • 情况一:当数据类型为[4,2,3],且 pre 为左侧边界, 将 nums[pre] 设为 nums[right] 数组变为[2,2,3]

      • 情况二:当数据类型为[1,4,2,3],且 nums[right] > nums[pre - 1] 既 2 > 1.将 nums[pre] 设为 nums[right] 数组变为1,2,2,3]

      • 情况三:当数据类型为[3,4,2,3],且nums[right] < nums[pre - 1] 既 2 < 1.将 nums[right] 设为 nums[ pre - 1] 数组变为[3,4,4,3]

    • 本质就是在遍历过程中,存在不递增情况下,使得相邻三个元素有序,主要分两种情况,[1,4,2]应该变为[1,2,2] ; [3,4,2]应该变为[3,4,4]

    方式一:

    class Solution {
        public boolean checkPossibility(int[] nums) {
            int changeCount = 1;
            int pre = 0,right = 1;
            while(right < nums.length){
                if(nums[pre] > nums[right]){
                    if(changeCount == 0)
                        return false;
                    if(pre == 0 || nums[right] >= nums[pre - 1])
                        nums[pre] = nums[right];
                    else 
                        nums[right] = nums[pre];
                    changeCount--;
                }
                pre = right;
                right++;
                
            }
            return true;
        }
    }
    

    优化:

    ​ 情况一与情况二可以只统计出现的次数,而不进行交换值,出现超过1次时则返回 flase

    方式二:

    class Solution {
        public boolean checkPossibility(int[] nums) {
            int count = 0;
            for(int i = 0; i < nums.length - 1;i++){
                int cur = nums[i],next = nums[i + 1];
                if(cur > next){
                    if(count++ > 0)
                        return false;
                    if(i > 0 && next < nums[i - 1])
                        nums[i + 1] = cur;
                }
            }
            return true;
        }
    }
    

    参考:

    https://leetcode-cn.com/problems/non-decreasing-array/solution/fei-di-jian-shu-lie-by-leetcode-solution-zdsm/

  • 相关阅读:
    CF1359D Yet Another Yet Another Task
    【数据结构】fhq_treap
    AtCoder Beginner Contest 182 题解
    UVA11992 Fast Matrix Operations
    双指针例题
    python使用国内镜像库
    APP元素定位工具之——Weditor
    安卓ADB的常见命令的使用
    函数进阶之迭代器,递归
    函数基础之对象,嵌套,名称空间和作用域
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/14384653.html
Copyright © 2011-2022 走看看