• 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;
        }
    }
    
  • 相关阅读:
    VC笔记
    安卓开发,调用系统相册或相机选择图片
    安卓gradle时报错"ERROR: Plugin with id 'com.android.application' not found."
    安卓开发 利用百度识图api进行物体识别(java版)
    安卓使用讯飞SDK
    《构建之法》读书笔记1
    安卓开发 利用百度识图api进行物体识别
    安卓使用讯飞sdk报错
    Android webview学习
    open failed: EACCES (Permission denied)
  • 原文地址:https://www.cnblogs.com/mapoos/p/14729677.html
Copyright © 2020-2023  润新知