Welcome to Subscribe On Youtube
1959. Minimum Total Space Wasted With K Resizing Operations
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
-
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]; } }
-
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]; } };
-
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]
-
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] }