I'm posting a solution for LeetCode's "Non-decreasing Array". If you'd like to review, please do. Thank you!
Problem
Given an array nums
with n
integers, your task is to check if it could become non-decreasing by modifying at most 1 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:
1 <= n <= 10 ^ 4
-10 ^ 5 <= nums[i] <= 10 ^ 5
Code
// Since the relevant headers are already included on the LeetCode platform, // the headers can be removed; #include <stdio.h> #include <stdbool.h> static const bool checkPossibility( int *nums, const int nums_size ) { if (nums_size < 3) { return true; } int max_changes = 0; for (int index = 1; index < nums_size - 1; ++index) { if (!(nums[index] >= nums[index - 1] && nums[index + 1] >= nums[index])) { if (nums[index + 1] >= nums[index - 1]) { ++max_changes; nums[index] = nums[index - 1]; } else { if (nums[index] < nums[index - 1] && nums[index + 1] < nums[index]) { return false; } else if (nums[index] <= nums[index + 1]) { nums[index - 1] = nums[index]; if (!(index - 1) || nums[index - 2] <= nums[index - 1]) { ++max_changes; } else { return false; } } else { nums[index + 1] = nums[index]; ++max_changes; } } } } return max_changes < 2; } int main() { static const int nums_size = 3; int nums_array[nums_size] = {4, 2, 1}; int (*nums)[nums_size] = &nums_array; fputs(checkPossibility(*nums, nums_size) ? "true" : "false", stdout); return 0; }