Description#
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
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class Solution:
def minSpaceWastedKResizing(self, nums: List[int], k: int) -> int:
k += 1
n = len(nums)
g = [[0] * n for _ in range(n)]
for i in range(n):
s = mx = 0
for j in range(i, n):
s += nums[j]
mx = max(mx, nums[j])
g[i][j] = mx * (j - i + 1) - s
f = [[inf] * (k + 1) for _ in range(n + 1)]
f[0][0] = 0
for i in range(1, n + 1):
for j in range(1, k + 1):
for h in range(i):
f[i][j] = min(f[i][j], f[h][j - 1] + g[h][i - 1])
return f[-1][-1]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| class Solution {
public int minSpaceWastedKResizing(int[] nums, int k) {
++k;
int n = nums.length;
int[][] g = new int[n][n];
for (int i = 0; i < n; ++i) {
int s = 0, mx = 0;
for (int j = i; j < n; ++j) {
s += nums[j];
mx = Math.max(mx, nums[j]);
g[i][j] = mx * (j - i + 1) - s;
}
}
int[][] f = new int[n + 1][k + 1];
int inf = 0x3f3f3f3f;
for (int i = 0; i < f.length; ++i) {
Arrays.fill(f[i], inf);
}
f[0][0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= k; ++j) {
for (int h = 0; h < i; ++h) {
f[i][j] = Math.min(f[i][j], f[h][j - 1] + g[h][i - 1]);
}
}
}
return f[n][k];
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| class Solution {
public:
int minSpaceWastedKResizing(vector<int>& nums, int k) {
++k;
int n = nums.size();
vector<vector<int>> g(n, vector<int>(n));
for (int i = 0; i < n; ++i) {
int s = 0, mx = 0;
for (int j = i; j < n; ++j) {
mx = max(mx, nums[j]);
s += nums[j];
g[i][j] = mx * (j - i + 1) - s;
}
}
int inf = 0x3f3f3f3f;
vector<vector<int>> f(n + 1, vector<int>(k + 1, inf));
f[0][0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= k; ++j) {
for (int h = 0; h < i; ++h) {
f[i][j] = min(f[i][j], f[h][j - 1] + g[h][i - 1]);
}
}
}
return f[n][k];
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| func minSpaceWastedKResizing(nums []int, k int) int {
k++
n := len(nums)
g := make([][]int, n)
for i := range g {
g[i] = make([]int, n)
}
for i := 0; i < n; i++ {
s, mx := 0, 0
for j := i; j < n; j++ {
s += nums[j]
mx = max(mx, nums[j])
g[i][j] = mx*(j-i+1) - s
}
}
f := make([][]int, n+1)
inf := 0x3f3f3f3f
for i := range f {
f[i] = make([]int, k+1)
for j := range f[i] {
f[i][j] = inf
}
}
f[0][0] = 0
for i := 1; i <= n; i++ {
for j := 1; j <= k; j++ {
for h := 0; h < i; h++ {
f[i][j] = min(f[i][j], f[h][j-1]+g[h][i-1])
}
}
}
return f[n][k]
}
|