https://leetcode-cn.com/problems/non-decreasing-array/submissions/
思路:虽然是简单题,不过还是挺考察思维能力的。不妨假设有
a
i
>
a
i
+
1
a_i>a_{i+1}
ai>ai+1,那么此时我们必须要修改元素使得它满足题意,有几种修改方式?两种。
1.
1.
1.当
a
i
−
1
<
=
a
i
+
1
a_{i-1}<=a_{i+1}
ai−1<=ai+1时,我们可以把
a
i
a_i
ai变成
a
i
−
1
a_{i-1}
ai−1;
2.
2.
2.当
a
i
−
1
>
a
i
+
1
a_{i-1}>a_{i+1}
ai−1>ai+1时,我们只能把
a
i
+
1
a_{i+1}
ai+1变成
a
i
a_i
ai。优先用哪种方式?当然是前者,这里涉及到贪心的思想。因为
a
i
+
1
a_{i+1}
ai+1越小,后面的序列越有可能满足题意,所以我们要尽量的让它更小。不理解这一点的我给你举个例子
3
、
4
、
3
、
3
3、4、3、3
3、4、3、3,显然把第二个
4
4
4变小是最优解,而不是把第三个
3
3
3变大。
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int cnt=0,n=nums.size();
--n;
for(int i=0;i<n;i++)
{
if(nums[i]>nums[i+1])
{
if(++cnt>1)
return false;
if(i&&nums[i-1]>nums[i+1])
nums[i+1]=nums[i];
}
}
return true;
}
};