Put Marbles in Bags

文章讨论了一种避免使用三维动态规划的高效算法,该算法用于在给定数组中找到k-1个最大相邻和与最小相邻和之间的差值。通过计算所有相邻元素之和,然后排序,可以利用优先队列选取最大和最小的k-1对相邻和,从而降低时间复杂度。
摘要由CSDN通过智能技术生成

Question:

请添加图片描述

思路:

这个题我乍一看就是用dp, 分段取. 但问题就是用dp就得三维, 因为还有一条k bags的条件. 所以一定会超时. 这个题的解法就真的genuis,
他这个本质上就是要找几个interval 然后这个interval要先找到边界sum最大的. 再找到边界sum 最小的.
所以这种题, 如果我们把它用数学展开来表示. 我们把array 分成 k 份可以写成

arr[] -> [0, m1], [m1+1, m2], [m2 +1, m3]…[mk-1 + 1, k]
再简化一下可以写成
arr[0] + arr[m1] + arr[m1+1] + arr[m2] + arr[m2+1] + arr[m3] + … arr[mk-1 + 1] + arr[last]
如果我们把相邻的几个数字都写在一起就变成
arr[0] + (arr[m1] + arr[m1+1]) + (arr[m2] + arr[m2+1]) + (arr[m3] + … arr[mk-1 + 1]) + arr[last]
这就是我们要找的 score.
假设这个是max.的 那么和min的diff. 就是相当于中间那一大块.
let m1,m2,m3,… represent max score的interval
mm1, mm2, mm3 represent min score的interval.
diff = arr[0] + (arr[m1] + arr[m1+1]) + (arr[m2] + arr[m2+1]) + (arr[m3] + … arr[mk-1 + 1]) + arr[last] - arr[0] - (arr[mm1] + arr[mm1+1]) + (arr[mm2] + arr[mm2+1]) + (arr[mm3] + … arr[mmk-1 + 1]) - arr[last],

现在来看这道题变成了什么, 不就是找出来最大的k-1个相邻的sum - 最小的k-1个相邻sum. 因为arr[0]和arr[last] 肯定max score和 min score里面的bags都有选, 所以可以直接抵消. 然后这个组合可以算成1对pair, 所以再找k-1个 pair (从0 到 n -1)
那么就可以priorityQueue把所有挨着的pair的score按顺序排列.
接着取k-1个就行了

class Solution {
    public long putMarbles(int[] weights, int k) {
        int n = weights.length - 1;
        // calculate all adjacents sum, why? see CSDN
        long allAdjacents[] = new long[n], res = 0;
        for (int i = 0; i < allAdjacents.length; i++) {
            allAdjacents[i] = weights[i] + weights[i + 1];
        }
        Arrays.sort(allAdjacents);
        for (int i = 0; i < k - 1; i++) {
            res += allAdjacents[n - 1 - i] - allAdjacents[i];
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值