We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
这道题很有意思!
先列一下感到疑惑、需要突破的条件口:
只要充分利用以上所有条件,配上合理的时间复杂度(观察题目参数大小范围),就可以解题了。
一开始我想用DP,但显然,不满足无后效性。那还有其他做法吗?那只能往排序/PQ方面靠了。
不如从示例出发:
Input: weights = [1,3,5,1], k = 2 Output: 4
从时间复杂度可以窥见一斑。要满足某些增长性,或者说要从每次遍历获得什么,而已知条件特殊的是k,所以可以从k遍历出发,用PQ结合数组,从而实现增长。
画图理解,可以得知当k=n||k==1的时候,结果为0。那么k-1,k-2...2呢,该如何变化?比如示例,一开始k==n时,最大和与最小和都是[1,1],[3,3],[5,5],[1,1],k减小1后,最大和变成[1,3],[5,5],[1,1],最小和变成[1,1],[3,5],[1,1]。那么可以发现,每次都是有一个类似子数组合并的过程,即,像链条一样连接nums[i]和nums[i+1]的关系,这个过程模拟了分割取和的情况。
k=n||k==1
k-1,k-2...2
k==n
[1,1],[3,3],[5,5],[1,1]
[1,3],[5,5],[1,1]
[1,1],[3,5],[1,1]
那么最终推导出,将相邻元素排序放入PQ中,从n逐级递减分割,就可以得到结论。
class Solution { public long putMarbles(int[] weights, int k) { int n = weights.length; if (k == 1 || k == n) { return 0; } long total = 0; for (int w : weights) { total += w; } PriorityQueue<int[]> mnHeap = new PriorityQueue<>((o1, o2) -> o1[0] + o1[1] - o2[0] - o2[1]); PriorityQueue<int[]> mxHeap = new PriorityQueue<>((a, b) -> -(a[0] + a[1] - b[0] - b[1])); for (int i = 0; i < n - 1; i++) { mxHeap.offer(new int[]{weights[i], weights[i + 1]}); mnHeap.offer(new int[]{weights[i], weights[i + 1]}); } long mx = total, mn = total; for (int i = n - 1; i >= k; i--) { int[] max = mxHeap.poll(); int[] min = mnHeap.poll(); mn -= max[0] + max[1]; mx -= min[0] + min[1]; } return mx - mn; } }
Tips:
The text was updated successfully, but these errors were encountered:
No branches or pull requests
这道题很有意思!
先列一下感到疑惑、需要突破的条件口:
只要充分利用以上所有条件,配上合理的时间复杂度(观察题目参数大小范围),就可以解题了。
一开始我想用DP,但显然,不满足无后效性。那还有其他做法吗?那只能往排序/PQ方面靠了。
不如从示例出发:
从时间复杂度可以窥见一斑。要满足某些增长性,或者说要从每次遍历获得什么,而已知条件特殊的是k,所以可以从k遍历出发,用PQ结合数组,从而实现增长。
画图理解,可以得知当
k=n||k==1
的时候,结果为0。那么k-1,k-2...2
呢,该如何变化?比如示例,一开始k==n
时,最大和与最小和都是[1,1],[3,3],[5,5],[1,1]
,k减小1后,最大和变成[1,3],[5,5],[1,1]
,最小和变成[1,1],[3,5],[1,1]
。那么可以发现,每次都是有一个类似子数组合并的过程,即,像链条一样连接nums[i]和nums[i+1]的关系,这个过程模拟了分割取和的情况。那么最终推导出,将相邻元素排序放入PQ中,从n逐级递减分割,就可以得到结论。
Tips:
其实就是那题codeforce分割成k份的提供给了我思路The text was updated successfully, but these errors were encountered: