665. Non-decreasing Array
Medium
Given an array nums with n integers, your task is to check if it could become non-decreasing by modifying at most one element.
We define an array is non-decreasing if nums[i] <= nums[i + 1] holds for every i (0-based) such that (0 <= i <= n - 2).
Example 1:
Input: nums = [4,2,3]
Output: true
Explanation: You could modify the first 4 to 1 to get a non-decreasing array.
Example 2:
Input: nums = [4,2,1]
Output: false
Explanation: You can't get a non-decreasing array by modify at most one element.
Constraints:
n == nums.length1 <= n <= 104-10^5 <= nums[i] <= 10^5
思路
遍历的时候以 4 个数字为一段 prev_num, nums[i], nums[i + 1], nums[i + 2]。
当首次检测到 nums[i] > nums[i + 1] 时,说明此处需要修改。可能存在两种修改方式:
- 修改
nums[i]使得prev_num <= nums[i] <= nums[i + 1],需满足prev_num <= nums[i + 1]; - 修改
nums[i + 1]使得nums[i] <= nums[i + 1] <= nums[i + 2],需满足nums[i] <= nums[i + 2]。
两种方式的共同前提是 prev_num <= nums[i + 2],若此前提不满足则必无法只改一个数达成要求。
(注:若 i + 2 超出范围,说明 nums[i + 1] 是最后一个数,此时只需修改 nums[i + 1] 即可达成要求。)
首次修改完成后,将 modified_flag 置 true,下一次再检测到异常序列则返回 false。
循环结束前更新 prev_num。
遍历完成后返回 true。
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int prev_num = INT_MIN;
int steps = nums.size() - 1;
bool modified_flag = false;
for (int i = 0; i < steps; ++i) {
if (nums[i] > nums[i + 1]) {
if (modified_flag) return false;
if (i + 2 <= steps) {
if (prev_num <= nums[i + 2] &&
(prev_num <= nums[i + 1] || nums[i] <= nums[i + 2])) {}
else return false;
}
modified_flag = true;
}
prev_num = nums[i];
}
return true;
}
};
Runtime: 12 ms, faster than 99.58% of C++ online submissions for Non-decreasing Array.
Memory Usage: 26.8 MB, less than 93.24% of C++ online submissions for Non-decreasing Array.