给你两个整数数组 nums1
和 nums2
。
从 nums1
中移除两个元素,并且所有其他元素都与变量 x
所表示的整数相加。如果 x
为负数,则表现为元素值的减少。
执行上述操作后,nums1
和 nums2
相等 。当两个数组中包含相同的整数,并且这些整数出现的频次相同时,两个数组 相等 。
返回能够实现数组相等的 最小 整数 x
。
示例 1:
输入:nums1 = [4,20,16,12,8], nums2 = [14,18,10]
输出:-2
解释:
移除 nums1
中下标为 [0,4]
的两个元素,并且每个元素与 -2
相加后,nums1
变为 [18,14,10]
,与 nums2
相等。
示例 2:
输入:nums1 = [3,5,5,3], nums2 = [7,7]
输出:2
解释:
移除 nums1
中下标为 [0,3]
的两个元素,并且每个元素与 2
相加后,nums1
变为 [7,7]
,与 nums2
相等。
提示:
3 <= nums1.length <= 200
nums2.length == nums1.length - 2
0 <= nums1[i], nums2[i] <= 1000
- 测试用例以这样的方式生成:存在一个整数
x
,nums1
中的每个元素都与x
相加后,再移除两个元素,nums1
可以与nums2
相等。
class Solution {
public:
int minimumAddedInteger(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size();
int m = nums2.size();
// 计算 nums2 的总和
int sum2 = accumulate(nums2.begin(), nums2.end(), 0);
int minX = INT_MAX;
// 尝试移除 nums1 中的每对元素
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
// 计算移除后的 nums1 剩余部分的和
int sum1 = 0;
for (int k = 0; k < n; ++k) {
if (k != i && k != j) {
sum1 += nums1[k];
}
}
// 计算需要的 x 使得 sum1 + m * x = sum2
int requiredX = (sum2 - sum1) / m;
// 验证此时 nums1 的所有元素加上 requiredX 后能否与 nums2 相等
vector<int> a;
for (int k = 0; k < n; ++k) {
if (k != i && k != j) {
a.push_back(nums1[k] + requiredX);
}
}
sort(a.begin(), a.end());
sort(nums2.begin(), nums2.end());
if (a == nums2) {
minX = min(minX, requiredX);
}
}
}
return minX;
}
};