LeetCode 3132.找出与数组相加的整数2
给你两个整数数组 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 相等。
由于nums1中可以删除两个数字,因此nums1中找3个数字,其中必定存在一个x,可以与nums1中的任意数相加,得到的结果在nums中也可以找到,现在问题在于这个x是否是最小的,我们可以对nums1和nums2进行排序,然后枚举nums2中最后一个数字与nums1中的后3个数字的差,这样nums1中的数字是最大的三个,也就保证了最小的x是这三个差之一:
class Solution {
public:int minimumAddedInteger(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int ans = numeric_limits<int>::max();int size1 = nums1.size();int size2 = nums2.size();unordered_map<int, bool> seen;for (int i = size1 - 1; i >= size1 - 3; --i) {int x = nums2[size2 - 1] - nums1[i];if (seen.find(x) != seen.end()) {continue;}seen[x] = true;int idx1 = 0;int idx2 = 0;int deleteNum = 0;while (idx1 < size1 && idx2 < size2) {if (nums1[idx1] + x == nums2[idx2]) {++idx1;++idx2;} else {++idx1;++deleteNum;if (deleteNum > 2) {break;}}}if (deleteNum <= 2 && x < ans) {ans = x;}}return ans;}
};
如果nums1的长度为n,nums2的长度为m,则此算法时间复杂度为O(nlogn + mlogm),空间复杂度为O(logn + logm)。