Leetcode 665 非递减数列
题目定义:
给你一个长度为 n 的整数数组,请你判断在 最多 改变 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
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
思路:
-
思路: 定义两个指针 right:指向当前需要遍历的元素; pre:指向前一个已经遍历的元素
-
数据类型考虑三种情况 : [4,2,3],[1,4,2,3],[3,4,2,3] 且都存在 nums[pre] < nums[right]
-
情况一:当数据类型为[4,2,3],且 pre 为左侧边界, 将 nums[pre] 设为 nums[right] 数组变为[2,2,3]
-
情况二:当数据类型为[1,4,2,3],且 nums[right] > nums[pre - 1] 既 2 > 1.将 nums[pre] 设为 nums[right] 数组变为1,2,2,3]
-
情况三:当数据类型为[3,4,2,3],且nums[right] < nums[pre - 1] 既 2 < 1.将 nums[right] 设为 nums[ pre - 1] 数组变为[3,4,4,3]
-
-
本质就是在遍历过程中,存在不递增情况下,使得相邻三个元素有序,主要分两种情况,[1,4,2]应该变为[1,2,2] ; [3,4,2]应该变为[3,4,4]
方式一:
class Solution {
public boolean checkPossibility(int[] nums) {
int changeCount = 1;
int pre = 0,right = 1;
while(right < nums.length){
if(nums[pre] > nums[right]){
if(changeCount == 0)
return false;
if(pre == 0 || nums[right] >= nums[pre - 1])
nums[pre] = nums[right];
else
nums[right] = nums[pre];
changeCount--;
}
pre = right;
right++;
}
return true;
}
}
优化:
情况一与情况二可以只统计出现的次数,而不进行交换值,出现超过1次时则返回 flase
方式二:
class Solution {
public boolean checkPossibility(int[] nums) {
int count = 0;
for(int i = 0; i < nums.length - 1;i++){
int cur = nums[i],next = nums[i + 1];
if(cur > next){
if(count++ > 0)
return false;
if(i > 0 && next < nums[i - 1])
nums[i + 1] = cur;
}
}
return true;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步