Non-decreasing-Array
非递减序列
https://leetcode-cn.com/problems/non-decreasing-array/
解题思路
解题关键是遇到$nums[i]>nums[i+1]$时,应该怎么处理?
- 找到第一处 $nums[i]>nums[i+1]$ ,改 $nums[i]$ 还是 $nums[i+1]$ 呢?
- 改 $nums[i]=nums[i+1]$ : 当且仅当 $nums[i-1]\leq nums[i+1]$ 时,因为需要保证 $nums[i-1] \leq nums[i] = nums[i+1]$
- 改 $nums[i+1] = nums[i]$ , $nums[i-1] \leq nums[i] = nums[i+1]$ 一定成立
- 然而我们应该优先改第一种情况 $nums[i]=nums[i+1]$ ,因为这样做是无后效性的,而第二种情况更改了 $nums[i+1]$ 的值,可能会破坏后面的单调递增序列,如这样一个序列:
1 100 2 3
代码
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int cnt=0;
for (int i=0;i<nums.size()-1;i++)
{
if (nums[i]>nums[i+1])
{
if (cnt)
return 0;
++cnt;
if (i==0)
continue;
if (i>0 && nums[i-1]<=nums[i+1])
{
nums[i]=nums[i+1];
continue;
}
nums[i+1]=nums[i];
}
}
return 1;
}
};
总结
分析完才发现这居然是一道贪心题。
做这种题不能面向用例测试,若是在面试时遇到这题我估计就凉了,简单题一点也不简单呀,不能小看简单题!我们需要认真拿出纸笔分析题目。