2551-将珠子放入背包中
你有 k
个背包。给你一个下标从 0 开始的整数数组 weights
,其中 weights[i]
是第 i
个珠子的重量。同时给你整数 k
。
请你按照如下规则将所有的珠子放进 k
个背包。
- 没有背包是空的。
- 如果第
i
个珠子和第j
个珠子在同一个背包里,那么下标在i
到j
之间的所有珠子都必须在这同一个背包中。 - 如果一个背包有下标从
i
到j
的所有珠子,那么这个背包的价格是weights[i] + weights[j]
。
一个珠子分配方案的 分数 是所有 k
个背包的价格之和。
请你返回所有分配方案中, 最大分数 与 最小分数 的 差值 为多少。
示例 1:
**输入:** weights = [1,3,5,1], k = 2
**输出:** 4
**解释:**
分配方案 [1],[3,5,1] 得到最小得分 (1+1) + (3+1) = 6 。
分配方案 [1,3],[5,1] 得到最大得分 (1+3) + (5+1) = 10 。
所以差值为 10 - 6 = 4 。
示例 2:
**输入:** weights = [1, 3], k = 2
**输出:** 0
**解释:** 唯一的分配方案为 [1],[3] 。
最大最小得分相等,所以返回 0 。
提示:
1 <= k <= weights.length <= 105
1 <= weights[i] <= 109
提示 1
问题相当于把 weights 划分成 k 个连续子数组,分数等于每个子数组的两端的值之和。
提示 2
weights}[0] 和 weights}[n-1] 一定在分数中,最大分数和最小分数相减,抵消了。
上一个子数组的末尾和下一个子数组的开头一定同时在分数中。
提示 3
把所有 n-1 个 weights}[i]+\textit{weights}[i+1] 算出来,排序,那么最大的 k-1 个数和最小的 k-1 个数相减,即为答案。
附:视频讲解
1 | class Solution: |
1 | class Solution { |
1 | class Solution { |
1 | func putMarbles(wt []int, k int) (ans int64) { |
复杂度分析
- 时间复杂度:O(n\log n),其中 n 为 nums 的长度。
- 空间复杂度:O(1)。忽略排序的栈空间,仅用到若干额外变量。
Comments