思路
1.找到第一个逆序对nums[i]和nums[i+1]。
2.假设nums[i+1]之后的序列是非递减的,那么修改肯定是要在nums[i]或者nums[i+1]之上进行的。
3.而且还需要保证nums[i+1]小于nums[i+2],那么我们该如何保证呢?
4.根据贪心,我们在选择修改nums[i]和nums[i+1]时必须要保证nums[i+1]最小。也就出现下面两种情况
{
n
u
m
s
[
i
]
=
n
u
m
s
[
i
+
1
]
,
i
=
=
1
n
u
m
s
[
i
]
=
n
u
m
s
[
i
+
1
]
,
n
u
m
s
[
i
+
1
]
>
n
u
m
s
[
i
−
1
]
n
u
m
s
[
i
+
1
]
=
n
u
m
s
[
i
]
,
n
u
m
s
[
i
+
1
]
<
=
n
u
m
s
[
i
−
1
]
\begin{cases} nums[i]=nums[i+1],i==1\\ nums[i]=nums[i+1],nums[i+1]>nums[i-1]\\ nums[i+1]=nums[i],nums[i+1]<=nums[i-1] \end{cases}
⎩⎪⎨⎪⎧nums[i]=nums[i+1],i==1nums[i]=nums[i+1],nums[i+1]>nums[i−1]nums[i+1]=nums[i],nums[i+1]<=nums[i−1]
代码
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int i=0;
int j=nums.size()-1;
int max_temp=nums[i];
int min_temp=nums[j];
for(i=0;i<nums.size()-1;i++)
{
max_temp=nums[i];
if(nums[i]>nums[i+1])
break;
}
if(i==nums.size()-1)
return true;
if(i>0&&nums[i+1]<nums[i-1])
nums[i+1]=nums[i];
for(i=i+1;i<nums.size()-1;i++)
{
if(nums[i]>nums[i+1])
return false;
}
return true;
}
};