你有 k
个背包。给你一个下标从 0 开始的整数数组 weights
,其中 weights[i]
是第 i
个珠子的重量。同时给你整数 k
。
请你按照如下规则将所有的珠子放进 k
个背包。
- 没有背包是空的。
- 如果第
i
个珠子和第j
个珠子在同一个背包里,那么下标在i
到j
之间的所有珠子都必须在这同一个背包中。 - 如果一个背包有下标从
i
到j
的所有珠子,那么这个背包的价格是weights[i] + weights[j]
。
一个珠子分配方案的 分数 是所有 k
个背包的价格之和。
请你返回所有分配方案中,最大分数 与 最小分数 的 差值 为多少。
建模:n个数,有n-1个缝,选k-1个缝,分割数组
两头的数肯定要加上的所以最大方案和最小方案都包含,差值就忽略两头的数了,就看缝的选择。
每选择一个缝,意味着和要加上缝两边的数字,创建以恶搞缝隙数组a,a[i]=weights[i]+weights[i+1]
。
最大方案就是去最大的k-1个,最小方案就是取最小的k-1个,然后相减。
k==1或者k==n时只有一种方案,相减结果是0,当然也是被通用逻辑兼容的,也可以不做特殊判断
/** * @param {number[]} weights * @param {number} k * @return {number} */ var putMarbles = function(weights, k) { if(k==1||k==weights.length) return 0; let a=new Array(weights.length-1); for(let i=0;i<a.length;i++) a[i]=weights[i]+weights[i+1]; a.sort((a,b)=>a-b); let sum1=0,sum2=0; for(let i=0;i<k-1;i++){ sum1+=a[i]; sum2+=a[a.length-1-i]; } return sum2-sum1; };