zoukankan      html  css  js  c++  java
  • 0665. Non-decreasing Array (M)

    Non-decreasing Array (M)

    题目

    Given an array nums with n integers, your task is to check if it could become non-decreasing by modifying at most one element.

    We define an array is non-decreasing if nums[i] <= nums[i + 1] holds for every i (0-based) such that (0 <= i <= n - 2).

    Example 1:

    Input: nums = [4,2,3]
    Output: true
    Explanation: You could modify the first 4 to 1 to get a non-decreasing array.
    

    Example 2:

    Input: nums = [4,2,1]
    Output: false
    Explanation: You can't get a non-decreasing array by modify at most one element.
    

    Constraints:

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

    题意

    给定一个数组,判断能否通过改变其中一个或零个数,使整个数组构成非递减序列。

    思路

    遍历数组,找到第一个i,使得 nums[i] > nums[i+1],这时我们尝试进行修复,有两种情况,要么改变nums[i],要么改变nums[i+1]:(1) i - 1 >= 0 且 nums[i-1] > nums[i+1],这时为了保证非递减,必须使 nums[i+1] = nums[i]; (2) i == 0 或者 nums[i-1] <= nums[i+1] 时,为了在之后的遍历中尽可能保证非递减,nums[i+1]必须尽可能的小,所以使 nums[i] = nums[i+1]。完成修复后,我们已经保证了子数组 [0 ~ i+1] 是一个非递减序列,且已经动用了唯一的修改机会,只要继续向后遍历判断是否仍存在 nums[j] > nums[j+1] 的情况即可。


    代码实现

    Java

    class Solution {
        public boolean checkPossibility(int[] nums) {
            boolean found = false;
            for (int i = 0; i + 1 < nums.length; i++) {
                if (nums[i] > nums[i + 1]) {
                    if (found) return false;
                    found = true;
                  	// 因为只有改变nums[i+1]才会影响之后的遍历,可以省略改变nums[i]的情况
                    if (i > 0 && nums[i - 1] > nums[i + 1]) nums[i + 1] = nums[i];
                }
            }
            return true;
        }
    }
    
  • 相关阅读:
    hdu 3746 Cyclic Nacklace
    hdu 3336 Count the string
    hdu 1358 Period
    hiho一下 第一周 最长回文子串
    KMP算法详解
    Java 之 static的使用方法(6)
    Jave 之方法-函数(5)
    Java 之数组(4)
    大数据-storm学习资料视频
    大数据-spark-hbase-hive等学习视频资料
  • 原文地址:https://www.cnblogs.com/mapoos/p/14729677.html
Copyright © 2011-2022 走看看