题目要求
给一个数组,若可以修改其中一个数字,使其为不减序列,则true.
思路1
把数组元素的大小想成阶梯,true的条件是仅出现一次锯齿状
edge case
1,3,4,2,5 true;关键在于对锯齿边界部分的3个元素how to modify
AC代码
class Solution {
public boolean rankCheck(int[] nums, int x){
return true;
}
public boolean checkPossibility(int[] nums) {
int flag = 0;
int tmp = 0;
for(int i = 1; i < nums.length; i++){
if(nums[i-1] > nums[i]){
for(int j = i; j < nums.length-1; j++){
if(nums[j] > nums[j+1]){
return false;
}
}
if(i == nums.length-1) return true;
if(i<nums.length-1 && nums[i-1]<nums[i+1]) return true;
if(nums[tmp] > nums[i] && flag==1) return false;
}
else if(nums[i-1] < nums[i]){
tmp = i-1;
flag = 1;
}else flag=1;
}
return true;
}
}
思路2
把满足不减序列这一条件的子列从前后方面分别排除,剩下中间部分的元素个数如果小于等于2,则true。大于等于5,则肯定不满足条件,因为只能modify一次。其他情况:3,4,需要用brute force处理
edge case
4,2,3 true;关键在于对锯齿边界部分的3个元素how to modify
WA代码(用了brute force思路,待修改)
class Solution {
public boolean checkPossibility(int[] nums) {
int len = nums.length;
int i = 0;
int j = len-1;
while(i < len-2 && nums[i] <= nums[i+1] && nums[i+1] <= nums[i+2]) i++;
while(j >= 2 && nums[j-2] <= nums[j-1] && nums[j-1] <= nums[j]) j--;
int t = j-i;
if(t+1 <= 2) return true;
else if(t+1 >= 5) return false;
else{
###brute force待修改###;
}
}
}