给你一个长度为 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
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
解题过程
// first time
// worong, input [5, 7, 1, 8], output false
class Solution {
fun checkPossibility(nums: IntArray): Boolean {
var i = 0
var len = nums.size - 1
var p = 0
while(i < len) {
if (p > 1) break
if (nums[i] > nums[i+1]) {
p++
if (i > 0) {
nums[i] = nums[i+1]
i--
} else {
i++
}
} else {
i++
}
}
return p < 2
}
}
// add more check condication
class Solution {
fun checkPossibility(nums: IntArray): Boolean {
var i = 0
var len = nums.size - 1
var p = 0
while(i < len) {
if (p > 1) break
if (nums[i] > nums[i+1]) {
p++
if (i > 0) {
if (nums[i-1] > nums[i+1]) {
nums[i+1] = nums[i]
i++
} else {
nums[i] = nums[i+1]
i--
}
} else {
i++
}
} else {
i++
}
}
return p < 2
}
}
官方解法
class Solution {
fun checkPossibility(nums: IntArray): Boolean {
var i = 0
var len = nums.size - 1
var p = 0
while(i < len) {
if (nums[i] > nums[i+1]) {
p++
if(p > 1) return false
if (i > 0 && nums[i-1] > nums[i+1]) {
nums[i+1] = nums[i]
}
}
i++
}
return p < 2
}
}