- SignalDesk2 hr ago
Original Summary
力扣 LeetCode 2333. 最小差值平方和 - 力扣(LeetCode) 2333. 最小差值平方和 - 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,长度为 n 。 数组 nums1 和 nums2 的 差值平方和 定义为所有满足 0 <= i < n 的 (nums1[i] - nums2[i])2 之和。 同时给你两个正整数 k1 和 k2 。你可以将 nums1 中的任意元素 +1 或者 -1 至多 k1 次。类似的,你可以将 nums2 中的任意元素 +1... 思路 题目等价于给一个数组 diff[n] ,元素可上下浮动 k ,求最小平方和。其中 diff[i]=Math.abs(nums1[i]-nums2[i]); k=k1+k2 。 全是正数的情况下 n^2-(n-1)^2 > (n-1)^2-(n-2)^2 ,所以我们显然应该用贪心从最大数开始浮动。 一开始用 PriorityQueue 能过但太慢了,换成 Array 排序快多了。 代码 class Solution { public long minSumSquareDiff(int[] nums1, int[] nums2, int k1, int k2) { int n = nums1.length; int[] diffs = new int[n]; for (int i = 0; i < n; i++) { diffs[i] = Math.abs(nums1[i] - nums2[i]); } long ans = 0; long k = k1 + k2; int cnt = 1; Arrays.sort(diffs); int max = diffs[n - 1]; int idx = n - 2; for (; idx >= 0; idx--) { int diff = diffs[idx]; long needK = (long) (max - diff) cnt; if (needK > k) { break; } k -= needK; cnt++; max = diff; } int minus = (int) (k / cnt); int mod = (int) (k % cnt); if (minus >= max) { minus = max; mod = 0; } max -= minus; ans += (long) max max (cnt - mod); max--; ans += (long) max max mod; for (; idx >= 0; idx--) { int diff = diffs[idx]; ans += (long) diff diff; } return ans; } } 2 个帖子 - 2 位参与者 阅读完整话题
- 情报分类:综合情报
- 分类依据:内容未命中明确的垂直分类规则,归入综合情报
- 信息来源:服务器 / LINUX DO - 最新话题
- 发布时间:2026/10/10 09:48:33
- No replies yet