题目描述
给定一个长度为 n
的整数数组,你的任务是判断在最多改变 1
个元素的情况下,该数组能否变成一个非递减数列。
输入: [4,2,3]
输出: True
解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。
解题思路
这个题不是很容易,思路:往小看齐,遇到逆序的,先和上一个看齐,再和下一个看齐。
-
分析过程如下:(我的实现)
//每2个比较 其实就是找出逆序对 //nums[i] > nums[i+1] 需要改变 //可以进行以下2种选择 //1 nums[i]变小 //2 nums[i+1]变大 //要求递增排列 3 4 2 3 当i = 1时 4 > 2递减 4需要变小(3,2,2,3 出问题了)(3,3,2,3 可以) 或2需要变大
参考代码
根据题意模拟
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int ct = 0;
for (int i = 0; i < nums.size() - 1; i++) {
if(nums[i] <= nums[i+1])
continue; // 递增
if(++ct > 1)
return false;
int temp = nums[i];
// 让nums[i]变小
if(i > 0)
nums[i] = nums[i-1]; // 防止变成3,2,2,3 等于前面的,可以保证不递减
else
nums[i] = nums[i+1]; // 不得已才这样
// 如果让nums[i]变小后还不行,还原nums[i]之后,让nums[i+1]变大
if(nums[i] > nums[i+1]){
nums[i] = temp; // 还原nums[i]
nums[i+1] = nums[i]; // 让nums[i+1]变大,变成nums[i]
}
}
return true;
}
};