Medium
You are currently designing a dynamic array. You are given a 0-indexed integer array nums
, where nums[i]
is the number of elements that will be in the array at time i
. In addition, you are given an integer k
, the maximum number of times you can resize the array (to any size).
The size of the array at time t
, sizet
, must be at least nums[t]
because there needs to be enough space in the array to hold all the elements. The space wasted at time t
is defined as sizet - nums[t]
, and the total space wasted is the sum of the space wasted across every time t
where 0 <= t < nums.length
.
Return the minimum total space wasted if you can resize the array at most k
times.
Note: The array can have any size at the start and does not count towards the number of resizing operations.
Example 1:
Input: nums = [10,20], k = 0
Output: 10
Explanation: size = [20,20].
We can set the initial size to be 20.
The total wasted space is (20 - 10) + (20 - 20) = 10.
Example 2:
Input: nums = [10,20,30], k = 1
Output: 10
Explanation: size = [20,20,30].
We can set the initial size to be 20 and resize to 30 at time 2.
The total wasted space is (20 - 10) + (20 - 20) + (30 - 30) = 10.
Example 3:
Input: nums = [10,20,15,30,20], k = 2
Output: 15
Explanation: size = [10,20,20,30,30].
We can set the initial size to 10, resize to 20 at time 1, and resize to 30 at time 3.
The total wasted space is (10 - 10) + (20 - 20) + (20 - 15) + (30 - 30) + (30 - 20) = 15.
Constraints:
1 <= nums.length <= 200
1 <= nums[i] <= 106
0 <= k <= nums.length - 1
@Suppress("NAME_SHADOWING")
class Solution {
fun minSpaceWastedKResizing(arr: IntArray, k: Int): Int {
var k = k
val n = arr.size
k++
val dp = Array(n) { IntArray(k + 1) }
for (j in 1..k) {
for (i in n - 1 downTo 0) {
val ele = n - i
if (j == ele) {
dp[i][j] = 0
continue
}
if (j == 1) {
var sum = 0
var maxEle = -1
for (l in i until n) {
maxEle = Math.max(maxEle, arr[l])
sum += arr[l]
}
dp[i][j] = maxEle * (n - i) - sum
continue
}
var maxEle = -1
var sum = 0
var ans = Int.MAX_VALUE
for (cut in i..n - j) {
maxEle = Math.max(maxEle, arr[cut])
sum += arr[cut]
val recAns = dp[cut + 1][j - 1]
val myAns = maxEle * (cut - i + 1) - sum
ans = Math.min(ans, recAns + myAns)
}
dp[i][j] = ans
}
}
return dp[0][k]
}
}