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 实现
四、总结小记
2022/7/31 今天天气很闷热呀
版权声明: 本文为 InfoQ 作者【okokabcd】的原创文章。
原文链接:【http://xie.infoq.cn/article/5b3cf6301ddf263dafc0170b7】。文章转载请联系作者。
评论