给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。 说明: n 的范围为 [1, 10,000]。
输入:
输出:
输入: [4,2,3] 输出: True 解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。
输入: [4,2,1] 输出: False 解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
cnt统计当前数比前一个数小的个数; 遍历数组中所有的值
bool checkPossibility(vector<int>& nums) {
int n = nums.size();
int cnt = 0;
for (int i = 1; i < n; i++) {
if (nums[i - 1] > nums[i]) {
cnt++;
//cnt = 1时,需要注意有两种情况可以补救:
//1. 比如[-1 4 2 3], 4 < 2, 2 > -1, 通过修改 4 为 -1~2 间的数都可以补救
//2. 比如[1 2 -1 3],-1 < 2, 2 < 3, 通过修改 -1 为 2~3 间的数都可以补救
//cnt >= 2则怎样都不行了,因为只能修改一次
if((cnt == 1 && i >= 2 && i < n - 1 && nums[i] < nums[i - 2] && nums[i + 1] < nums[i - 1]) || cnt >= 2) return false;
}
}
return true;
}
本题中需要考虑多种情况的可能性,否则容易犯错。
无。
方法 | 空间复杂度 | 时间复杂度 |
---|---|---|
比较计数法 | O(1) | O(n) |
如果给你的是链表数据呢?