非递减数列
作者:互联网
题目描述:
给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。
我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。
方法一:
一,当数组长度小于3时,最多需要调整一次就能满足条件
二,当数组长度大于等于3时,出现第i+1个元素大于第i个元素时,当第i-1个元素大于第i+1个元素时,nums[i+1]=nums[i];
class Solution {
public boolean checkPossibility(int[] nums) {
int len=nums.length;
if(len<3){
return true;
}
int count=0;
for(int i=0;i<len-1;i++){
if(nums[i+1]<nums[i]){
count++;
if(count>1){
return false;
}
if(i>0&&nums[i-1]>nums[i+1]){
nums[i+1]=nums[i];
}
}
}
return true;
}
}
方法二:
需要改变的数有两种情况,一种是该数比两边的数都小,一种是比两边的数都大;
- 对于第一种情况,顺序遍历找出这样的数的个数count1:用max保存前面遍历过的最大数,如果nums[i]小于max,则count1加一;
- 对于第二种情况顺序无法查找,因此用倒序遍历找出这样的数的个数count2:用min保存遍历过的最小值,如果nums[l-i-1]大于min,则count2加一;
最后只要count1和count2只要有一个小于等于1就满足要求
class Solution {
public boolean checkPossibility(int[] nums) {
int count1=0;
int count2=0;
int len=nums.length;
int max=nums[0];
int min=nums[len-1];
for(int i=1;i<len;i++){
if(nums[i]<max){
count1++;
}
if(nums[len-i-1]>min){
count2++;
}
max=max>nums[i]?max:nums[i];
min=min<nums[len-1-i]?min:nums[len-1-i];
}
return count1<=1||count2<=1;
}
}
ZQQ~BK
发布了98 篇原创文章 · 获赞 12 · 访问量 2003
私信
关注
标签:递减,数列,nums,int,max,min,count1,count2 来源: https://blog.csdn.net/qq_42174669/article/details/104092473