力扣刷题——3132.找出与数组相加的整数II

发布于:2025-03-12 ⋅ 阅读:(14) ⋅ 点赞:(0)

题目:

给你两个整数数组 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 相等。

显而易见,使用双指针来解题,而且我们可以看出这道题的实质是需要判断子数组,所以是需要对两个数组进行排序的。

ranges::sort(nums1);
ranges::sort(nums2);

排序之后,我们再回到题目,需要删除两个nums1的元素后两个数组的长度相等,意味着

nums2.size()==nums1.size()-2;

再结合刚才对两个数组的排序,我们可以想到:

nums2[0],也即是nums2的最小元素,再减去x(两数组差值)就是nums1中最小的三个元素之一

所以我们可以对nums1[2],nums1[1],nums1[0]逐个进行判断(倒序判断的原因是排序之后下标越大,元素值越大,则两数组差值越小,题目正是要找最小的x,一旦找到可以直接返回),然后就变成了一个子数组判断的问题了

class Solution {
public:
    int minimumAddedInteger(vector<int>& nums1, vector<int>& nums2) {

        int n=nums1.size();
        int m=nums2.size();
        ranges::sort(nums1);
        ranges::sort(nums2);
        
        for(int i=2;i>0;i--)//不用判断nums1[0]了
        {
           int x=nums2[0]-nums1[i];
           int j=0;
           for(int p=i;p<n;p++)
           {
            if(nums1[p]+x==nums2[j])
            {
                j++;
            }
            if(j==m)
            {
                return x;
            }
           }
        }
        return nums2[0]-nums1[0];
    }
};