你有 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; };
浙公网安备 33010602011771号