解题想法:刚开始想着简单的就是直接判断存在相邻递减的情况,即判断存在nums[i]>nums[i-1]的情况,但是存在不满足的用例:
后来想遍历的时候如果存在递减的情况,就用nums[i-1]更新nums[i],即下图用例的情况:
然后发现还是有不满足的情况,即下例:
于是就选择用两次遍历,分别判断,当从左往右遍历的时候,选择用左侧的更大的值更新右侧继续判断,如果满足,返回,否则从右往左遍历,选择用右侧更小的值更新继续判断,此时注意最后返回判断一定是存在一次修改
public boolean checkPossibility(int[] nums) {
int sum1 = 0;
//copy 一个数组
int [] cp = new int[nums.length];
for(int i=0;i=0;i--){
if(i-1>=0&&nums[i-1]>nums[i]){
nums[i-1] = nums[i];
sum1++;
}
if(sum1>1) break;
}
//return true;
if(sum1<=1) return true; //就是一遍修改可以满足
//还是两遍循环?
int sum2 = 0;
for(int i=0;i1) break;
}
return sum2==1? true:false; //因为走到这里必定存在要修改的地方,如果是0则是表示无法修改,如果>1表示修改不只一处
}
查看题解后发现可以一次遍历,在判断的时候进行优化:
public static boolean isSorted(int[]nums){
for(int i=0;i
简单的题有时候也不能想的太简单,以上动图来自:负雪明烛



