题目
给你一个长度为 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
解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
提示:
1 <= n <= 10 ^ 4
- 10 ^ 5 <= nums[i] <= 10 ^ 5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-decreasing-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
想法
后一个数大于等于前一个数就好了,再用一个count计数,当count== 长度-1,说明改变一个数即可是非递减数列。
class Solution {
public boolean checkPossibility(int[] nums) {
boolean flage= false;
int count = 1;
int n = nums.length ;
for(int i = 1 ; i<n; i ++ )
{
if(nums[i-1]<= nums[i])
{
count++;
}
}
if(count == n-1) flage = true;
return flage;
}
}
提交后:还是有一些问题。239/335.
看了下评论,提交一些测试案列,发现了一些问题。
如例子[3,4,2,3],如果i=1,4 和2 就大小有问题,需要进行一下交换,然后才能往后走。
看代码:
class Solution {
public boolean checkPossibility(int[] nums) {
int count = 0 ; int n = nums.length;
for(int i = 0 ; i < n-1;i++)
{
if(nums[i]>nums[i+1])
{
count++;
if(i>0&&nums[i-1]>nums[i+1])
{
nums[i+1] = nums[i];
}
}
}
return count<2;
}
}
总结
这些题总是想的不是很周到,第二个代码还是看了评论的,官方的反而太多,没有仔细去看了,第二个思想就很容易理解,当前值和后面的去比较,如果前面的值大于后面的值,进行一下交换,这样的count最多只能自加1,加多了返回false。