You have k bags. You are given a 0-indexed integer array weights where weights[i] is the weight of the ith marble. You are also given the integer k.
Divide the marbles into the k bags according to the following rules:
- No bag is empty.
- If the
ithmarble andjthmarble are in a bag, then all marbles with an index between theithandjthindices should also be in that same bag. - If a bag consists of all the marbles with an index from
itojinclusively, then the cost of the bag isweights[i] + weights[j].
The score after distributing the marbles is the sum of the costs of all the k bags.
Return the difference between the maximum and minimum scores among marble distributions.
Example 1:
Input: weights = [1,3,5,1], k = 2
Output: 4
Explanation:
The distribution [1],[3,5,1] results in the minimal score of (1+1) + (3+1) = 6.
The distribution [1,3],[5,1], results in the maximal score of (1+3) + (5+1) = 10.
Thus, we return their difference 10 - 6 = 4.
Example 2:
Input: weights = [1, 3], k = 2
Output: 0
Explanation: The only distribution possible is [1],[3].
Since both the maximal and minimal score are the same, we return 0.
Constraints:
1 <= k <= weights.length <= 1051 <= weights[i] <= 109
Approach
-
So the important point in this question is we can solve this by maintaining adjacent sum array why you ask? because when you will part then in calculating sum you will have last element of previous part added with first element of a partition aka adjacent sum
-
Something like this : weights = [1, 3, 5, 1], k = 2
You need 1 cut. Possible cuts:Between 1|3 → groups: [1], [3,5,1] → cost: 1+1 + 3+1 = 6 Between 3|5 → [1,3], [5,1] → cost: 1+3 + 5+1 = 10 Between 5|1 → [1,3,5], [1] → cost: 1+5 + 1+1 = 8 -
Time:
O(nlogn)time taken to sort, Space:O(n)
class Solution {
public long putMarbles(int[] weights, int k) {
int[] sum = new int[weights.length-1];
for (int i = 0; i < sum.length; i++) {
sum[i] = weights[i] + weights[i+1];
}
Arrays.sort(sum);
long min = 0, max = 0;
// for k bags there would be k - 1 parting lines
for (int i = 0; i < k - 1; i++) {
min += sum[i];
max += sum[sum.length - i - 1];
}
return max - min;
}
}