665. 非递减数列
题目来源:力扣(LeetCode)
https://leetcode-cn.com/problems/non-decreasing-array/
解题思路:
原问题分解为子问题 ——》 求解子问题的最优解 ——》 合并子问题最优解得到原问题最优解。
本题简单的分解,可以考虑将连续的三个元素作为一个子问题,判断是否为非递减序列;此时会想到原数组元素没有三个,那么只有一个或两个元素的数组单独拿出来考虑,此时一定可以得到原问题的解,直接返回 true。
数组含有三个及以上的元素,每三个元素作为一个子问题,然后逐步向后移动一个元素,得到下个新的子问题。那么,每一个子问题可能出现的情况如下:
1、 nums[i-1]>nums[i] && nums[i]>nums[i+1]
直接返回 false,不可只改一个元素即可得到非递减序列。
2、nums[i-1]<=nums[i] && nums[i]>nums[i+1]
3、nums[i-1]>nums[i] && nums[i]<=nums[i+1]
上述两种情况需要讨论第一个元素与第三个元素之间的关系,来判断子问题的三个元素中哪个元素需要修改。同时设置一个计数标志位,来判断所有子元素修改的次数,当修改两次及以上既不符合题目的要求,此时直接返回 false。
4、最后一种情况就是子问题一开始就满足子问题最优解的情况。
代码:
class Solution {
public boolean checkPossibility(int[] nums) {
int flag = 0;
if(nums.length <=2 ){
return true;
}
for(int i= 1; i<nums.length-1; i++){
if(nums[i-1]>nums[i] && nums[i]>nums[i+1]){
return false;
}else if(nums[i-1]<=nums[i] && nums[i]>nums[i+1]){
if(nums[i-1]<=nums[i+1]){
nums[i] = nums[i-1];
}else{
nums[i+1] = nums[i];
}
flag++;
}else if(nums[i-1]>nums[i] && nums[i]<=nums[i+1]){
if(nums[i-1]<=nums[i+1]){
nums[i] = nums[i-1];
}else{
nums[i-1] = nums[i];
}
flag++;
}
if(flag == 2)
return false;
}
return true;
}
}