665. 非递减数列
给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-decreasing-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
// use std::assert;
// need mpdify
// 假定数组[a, b, c] 明确a < b ,b > c
// 修改使得 b=c, 策略 有两个:
// b变小
// c变大
// 什么时候变小? a<c
// 什么时候变大? a>c
// idx < 2 的时候认为 前两个数无限小, 此时应该是 b 变小
fn check_possibility(nums: Vec<i32>) -> bool {
let mut _pre: i32 = nums[0];
let mut change_cnt: u8 = 0;
for idx in 1..nums.len() {
if change_cnt > 1 {
break;
}
if _pre > nums[idx] {
change_cnt = change_cnt + 1;
if idx < 2 || nums[idx - 2] <= nums[idx] {
_pre = nums[idx]
}
} else {
_pre = nums[idx];
}
}
return change_cnt < 2;
}
fn main() {
let nums1: Vec<i32> = vec![4, 2, 3];
let nums2: Vec<i32> = vec![4, 2, 1];
let nums3: Vec<i32> = vec![3, 4, 2, 3];
print!("num1 {}\n", check_possibility(nums1));
print!("num2 {}\n", check_possibility(nums2));
print!("num3 {}\n", check_possibility(nums3));
}
本文介绍了一种算法来判断一个整数数组是否可以通过最多改变一个元素变成非递减数列。通过示例代码展示了如何实现和检查可能性。关键在于比较相邻元素并决定何时调整哪个元素。

被折叠的 条评论
为什么被折叠?



