写点什么

leetcode 665. Non-decreasing Array 非递减数列 (中等)

作者:okokabcd
  • 2022 年 7 月 31 日
  • 本文字数:943 字

    阅读完需:约 3 分钟

leetcode 665. Non-decreasing Array 非递减数列(中等)

一、题目大意

标签: 贪心


https://leetcode.cn/problems/non-decreasing-array


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


提示:


  • n == nums.length

  • 1 <= n <= 104

  • -105 <= nums[i] <= 105

二、解题思路

最多只有一次修改某个数字的机会,问能否将数组变为非递减数组。举例


例 1:4,2, 3


例 2:-1, 4, 2, 3


例 3:2, 3, 3,2, 4 当后面的数字小于前面的数字后,例如例 1 中的 2 小于 4,这时可以将修改前面的数字将 4 修改为 2 或修改后面的数字将 2 改为 4。我们需要找到这个规律,判断修改哪个数字其实跟再前面的一个数大小有关系:


如果再前面的数不存在,例 1 中,4 前面没有数字了我们直接修改前面的数字为当前数字 2 即可;


如果再前面的数字存在,并且小于当前数字时,例 2 中,我们需要修改前面的数字 4 为当前数字 2;


如果再前面的数字存在,且大于当前数,例 3 中,我们需要修改当前数字 2 为前面的数 3。


由于只有一次修改的机会,所以用一个变量 cnt,初始化为 1,修改数字后 cnt 自减 1,当下次再需要修改时,如果 cnt 为 0,直接返回 false。遍历结束后返回 true。

三、解题方法

3.1 Java 实现

public class Solution {    public boolean checkPossibility(int[] nums) {        int cnt = 1;        for (int i = 1; i < nums.length; i++) {            if (nums[i] < nums[i - 1]) {                if (cnt == 0) {                    return false;                }                cnt--;                if (i == 1) {                    nums[i - 1] = nums[i];                } else if (nums[i] >= nums[i - 2]) {                    nums[i - 1] = nums[i];                } else {                    nums[i] = nums[i - 1];                }            }        }        return true;    }}
复制代码

四、总结小记

  • 2022/7/31 今天天气很闷热呀

发布于: 刚刚阅读数: 4
用户头像

okokabcd

关注

还未添加个人签名 2019.11.15 加入

一年当十年用的Java程序员

评论

发布
暂无评论
leetcode 665. Non-decreasing Array 非递减数列(中等)_LeetCode_okokabcd_InfoQ写作社区