思想:
如图:如果数列上边的抖动个数大于等于两个,则肯定不可能只改动一个元素使得数列整体非减。对于有单个抖动的局部(下图右侧),可以选择将p处的元素增大或者将p+1处的元素减小,可以成功操作的条件为:
n
u
m
s
[
p
+
1
]
>
=
n
u
m
s
[
p
−
1
]
∣
∣
n
u
m
s
[
p
+
2
]
>
=
n
u
m
s
[
p
]
nums[p+1] >= nums[p-1] || nums[p+2] >= nums[p]
nums[p+1]>=nums[p−1]∣∣nums[p+2]>=nums[p]
c++代码:
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
bool ans = true;
if(nums.size() == 1)return ans;
int count=0;
int p=0;
for(int i=0; i<nums.size()-1; i++){
if(nums[i]>nums[i+1]){
count++;p=i;
}
if(count==2)return false;
}
if(count==0)return true;
else{//count==1
if(p==0 || p+1 ==nums.size()-1)return true;
else{
if(nums[p+1] >= nums[p-1] || nums[p+2] >= nums[p] )
return true;
else return false;
}
}
}
};