class Solution {
public:
long long minSumSquareDiff(vector<int>& nums1, vector<int>& nums2, int k1, int k2) {
}
};
2333. 最小差值平方和
给你两个下标从 0 开始的整数数组 nums1
和 nums2
,长度为 n
。
数组 nums1
和 nums2
的 差值平方和 定义为所有满足 0 <= i < n
的 (nums1[i] - nums2[i])2
之和。
同时给你两个正整数 k1
和 k2
。你可以将 nums1
中的任意元素 +1
或者 -1
至多 k1
次。类似的,你可以将 nums2
中的任意元素 +1
或者 -1
至多 k2
次。
请你返回修改数组 nums1
至多 k1
次且修改数组 nums2
至多 k2
次后的最小 差值平方和 。
注意:你可以将数组中的元素变成 负 整数。
示例 1:
输入:nums1 = [1,2,3,4], nums2 = [2,10,20,19], k1 = 0, k2 = 0 输出:579 解释:nums1 和 nums2 中的元素不能修改,因为 k1 = 0 和 k2 = 0 。 差值平方和为:(1 - 2)2 + (2 - 10)2 + (3 - 20)2 + (4 - 19)2 = 579 。
示例 2:
输入:nums1 = [1,4,10,12], nums2 = [5,8,6,9], k1 = 1, k2 = 1 输出:43 解释:一种得到最小差值平方和的方式为: - 将 nums1[0] 增加一次。 - 将 nums2[2] 增加一次。 最小差值平方和为: (2 - 5)2 + (4 - 8)2 + (10 - 7)2 + (12 - 9)2 = 43 。 注意,也有其他方式可以得到最小差值平方和,但没有得到比 43 更小答案的方案。
提示:
n == nums1.length == nums2.length
1 <= n <= 105
0 <= nums1[i], nums2[i] <= 105
0 <= k1, k2 <= 109
原站题解
golang 解法, 执行用时: 160 ms, 内存消耗: 8.8 MB, 提交时间: 2023-07-01 13:52:49
func minSumSquareDiff(a, nums2 []int, k1, k2 int) int64 { ans, sum := 0, 0 for i, v := range a { a[i] = abs(v - nums2[i]) sum += a[i] ans += a[i] * a[i] } k := k1 + k2 if sum <= k { return 0 // 所有 a[i] 均可为 0 } sort.Sort(sort.Reverse(sort.IntSlice(a))) a = append(a, 0) // 哨兵 for i, v := range a { i++ ans -= v * v if c := i * (v - a[i]); c < k { k -= c continue } v -= k / i ans += k%i*(v-1)*(v-1) + (i-k%i)*v*v break } return int64(ans) } func abs(x int) int { if x < 0 { return -x }; return x }
cpp 解法, 执行用时: 144 ms, 内存消耗: 93 MB, 提交时间: 2023-07-01 13:52:38
class Solution { public: long long minSumSquareDiff(vector<int> &a, vector<int> &nums2, int k1, int k2) { int n = a.size(), k = k1 + k2; long ans = 0L, sum = 0L; for (int i = 0; i < n; ++i) { a[i] = abs(a[i] - nums2[i]); sum += a[i]; ans += (long) a[i] * a[i]; } if (sum <= k) return 0; // 所有 a[i] 均可为 0 sort(a.begin(), a.end(), greater<int>()); a.push_back(0); // 哨兵 for (int i = 0;; ++i) { long j = i + 1, v = a[i], c = j * (v - a[j]); ans -= v * v; if (c < k) { k -= c; continue; } v -= k / j; return ans + k % j * (v - 1) * (v - 1) + (j - k % j) * v * v; } } };
java 解法, 执行用时: 13 ms, 内存消耗: 54.4 MB, 提交时间: 2023-07-01 13:52:25
class Solution { public long minSumSquareDiff(int[] a, int[] nums2, int k1, int k2) { int n = a.length, k = k1 + k2; long ans = 0L, sum = 0L; for (var i = 0; i < n; ++i) { a[i] = Math.abs(a[i] - nums2[i]); sum += a[i]; ans += (long) a[i] * a[i]; } if (sum <= k) return 0; // 所有 a[i] 均可为 0 Arrays.sort(a); for (var i = n - 1; ; --i) { var m = n - i; long v = a[i], c = m * (v - (i > 0 ? a[i - 1] : 0)); ans -= v * v; if (c < k) { k -= c; continue; } v -= k / m; return ans + k % m * (v - 1) * (v - 1) + (m - k % m) * v * v; } } }
python3 解法, 执行用时: 148 ms, 内存消耗: 32.4 MB, 提交时间: 2023-07-01 13:52:12
class Solution: def minSumSquareDiff(self, a: List[int], nums2: List[int], k1: int, k2: int) -> int: ans, k = 0, k1 + k2 for i in range(len(a)): a[i] = abs(a[i] - nums2[i]) ans += a[i] * a[i] if sum(a) <= k: return 0 # 所有 a[i] 均可为 0 a.sort(reverse=True) a.append(0) # 哨兵 for i, v in enumerate(a): ans -= v * v j = i + 1 c = j * (v - a[j]) if c < k: k -= c continue v -= k // j return ans + k % j * (v - 1) * (v - 1) + (j - k % j) * v * v