Non-decreasing Array

medium array greedy

Problem

Given an array nums, return true if you can make it non-decreasing by modifying at most one element. At each violation nums[i] > nums[i+1], lower nums[i+1] to nums[i] if nums[i-1] ≤ nums[i+1]; otherwise raise nums[i] to nums[i+1].

Inputnums = [4, 2, 3]
Outputtrue
Lower nums[0]=4 to 2 (or any value ≤ 2), giving [2, 2, 3] which is non-decreasing.

def check_possibility(nums):
    fixes = 0
    for i in range(len(nums) - 1):
        if nums[i] > nums[i + 1]:
            fixes += 1
            if fixes > 1:
                return False
            if i > 0 and nums[i - 1] > nums[i + 1]:
                nums[i + 1] = nums[i]
            else:
                nums[i] = nums[i + 1]
    return True
function checkPossibility(nums) {
  let fixes = 0;
  for (let i = 0; i < nums.length - 1; i++) {
    if (nums[i] > nums[i + 1]) {
      fixes++;
      if (fixes > 1) return false;
      if (i > 0 && nums[i - 1] > nums[i + 1]) nums[i + 1] = nums[i];
      else nums[i] = nums[i + 1];
    }
  }
  return true;
}
class Solution {
    public boolean checkPossibility(int[] nums) {
        int fixes = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            if (nums[i] > nums[i + 1]) {
                fixes++;
                if (fixes > 1) return false;
                if (i > 0 && nums[i - 1] > nums[i + 1]) nums[i + 1] = nums[i];
                else nums[i] = nums[i + 1];
            }
        }
        return true;
    }
}
bool checkPossibility(vector<int>& nums) {
    int fixes = 0;
    for (int i = 0; i < (int) nums.size() - 1; i++) {
        if (nums[i] > nums[i + 1]) {
            fixes++;
            if (fixes > 1) return false;
            if (i > 0 && nums[i - 1] > nums[i + 1]) nums[i + 1] = nums[i];
            else nums[i] = nums[i + 1];
        }
    }
    return true;
}
Time: O(n) Space: O(1)