You are given a 0-indexed integer array nums
having length n
, and an integer k
.
You can perform the following increment operation any number of times (including zero):
- Choose an index
i
in the range[0, n - 1]
, and increasenums[i]
by1
.
An array is considered beautiful if, for any subarray with a size of 3
or more, its maximum element is greater than or equal to k
.
Return an integer denoting the minimum number of increment operations needed to make nums
beautiful.
A subarray is a contiguous non-empty sequence of elements within an array.
Example 1:
Input: nums = [2,3,0,0,2], k = 4 Output: 3 Explanation: We can perform the following increment operations to make nums beautiful: Choose index i = 1 and increase nums[1] by 1 -> [2,4,0,0,2]. Choose index i = 4 and increase nums[4] by 1 -> [2,4,0,0,3]. Choose index i = 4 and increase nums[4] by 1 -> [2,4,0,0,4]. The subarrays with a size of 3 or more are: [2,4,0], [4,0,0], [0,0,4], [2,4,0,0], [4,0,0,4], [2,4,0,0,4]. In all the subarrays, the maximum element is equal to k = 4, so nums is now beautiful. It can be shown that nums cannot be made beautiful with fewer than 3 increment operations. Hence, the answer is 3.
Example 2:
Input: nums = [0,1,3,3], k = 5 Output: 2 Explanation: We can perform the following increment operations to make nums beautiful: Choose index i = 2 and increase nums[2] by 1 -> [0,1,4,3]. Choose index i = 2 and increase nums[2] by 1 -> [0,1,5,3]. The subarrays with a size of 3 or more are: [0,1,5], [1,5,3], [0,1,5,3]. In all the subarrays, the maximum element is equal to k = 5, so nums is now beautiful. It can be shown that nums cannot be made beautiful with fewer than 2 increment operations. Hence, the answer is 2.
Example 3:
Input: nums = [1,1,2], k = 1 Output: 0 Explanation: The only subarray with a size of 3 or more in this example is [1,1,2]. The maximum element, 2, is already greater than k = 1, so we don't need any increment operation. Hence, the answer is 0.
Constraints:
3 <= n == nums.length <= 105
0 <= nums[i] <= 109
0 <= k <= 109
Companies: Google
Related Topics:
Array, Dynamic Programming
Hints:
- There needs to be at least one value among
3
consecutive values in the array that is greater than or equal tok
. - The problem can be solved using dynamic programming.
- Let
dp[i]
be the minimum number of increment operations required to make the subarray consisting of the firsti
values beautiful, while also having the value atnums[i] >= k
. dp[0] = max(0, k - nums[0])
,dp[1] = max(0, k - nums[1])
, anddp[2] = max(0, k - nums[2])
.dp[i] = max(0, k - nums[i]) + min(dp[i - 1], dp[i - 2], dp[i - 3])
fori
in the range[3, n - 1]
.- The answer to the problem is
min(dp[n - 1], dp[n - 2], dp[n - 3])
.
Let dp[i+1]
be the minimum number of operations needed to make A[0..i]
beautiful with the last operation applied onto A[i]
. The answer is min(dp[N-1], dp[N-2], dp[N-3])
.
When we apply an operation on A[i]
with max(k - A[i], 0)
operations, the previous operation must be applied on one of A[i-1]
, A[i-2]
and A[i-3]
. We can greedily pick the minimum of dp[i-1], dp[i-2], dp[i-3]
.
dp[0] = 0
dp[i+1] = max(k - n, 0) // # of operations needed on A[i]
+ min({a, b, c}) // min # of operations needed for the previous 3 states
// OJ: https://leetcode.com/problems/minimum-increment-operations-to-make-array-beautiful
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
long long minIncrementOperations(vector<int>& A, int k) {
long long a = 0, b = LLONG_MAX, c = LLONG_MAX;
for (int n : A){
long long x = max(k - n, 0) + min({a, b, c});
c = b;
b = a;
a = x;
}
return min({a, b, c});
}
};