LeetBook乐扣题库 3132. 找出与数组相加的整数 II

一 题目描述

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

二 方法代码

思路:

第一步,排序,不必多说

第二步,因为nums2比nums1的数量少两个,假设nums1去掉两个数,并满足题意的新序列为 k

              因此,k的第一个数字,一定是nums1的前三个数字中的一个,即nums1[0]、nums1[1]、nums1[2],这三个中的某一个数是k的第一个数,所以我们可以枚举,即把三个数为k[0]的情况分别列一下,看哪个是对的

第三步,我们按照倒序,也就首先是nums1[2]为第一个数的情况,然后是nums1[1]、nums1[0],这是因为一个例子可能会有多个x满足题意,因此当排序好之后,从最后一个数,即i=2开始,如果满足题意,这时候的x一定是最小的,因为此时的x为nums2[0] - nums1[2],它是一定比 i=1 的时候满足题意的x(nums2[0] - nums1[1])大的(因为nums1[2]大于nums1[1])

第四步,使用双指针,left为nums1的指针,right为nums2的指针。left会每次循环向右移动,但right只有在满足差值相等的时候才向右移动,通过这种方式判断 k 序列的的第一位究竟是nums1[0]、nums1[1]、nums1[2]中的哪一个

第五步,如果枚举完某一种情况之后,次数right等于nums2的长度,说明这种情况可以满足题意,指针移动到了nums2的尾部,返回结果

  • 方法一

public int minimumAddedInteger(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);

        //nums1的前三个中一定包含新序列的第一项
        //从2开始,是因为看你会有多个x满足情况,从后面开始算满足情况的一定是最小的
        //比如,从第三项也就是i=2开始,如果和nums2的满足题目关系的x,一定比i=1的x要小
        for(int i = 2; i >= 0; i--){
            //定义双指针,right为nums2的第二个数
            //枚举:假定新序列从i开始,left为i+1,即对应第二项
            int left = i+1, right = 1;
            while(left < nums1.length && right < nums2.length){
                //差值相等,说明满足新序列的条件,继续进行下次,比较下一个位置的两个数
                if(nums2[right] - nums1[left] == nums2[0] - nums1[i]){
                    right++;
                }
                left++;
            }

            //如果rigth等于长度,说明指针移动到了nums2的尾部,说明所有的数都满足新序列,返回
            if(right == nums2.length){
                return nums2[0] - nums1[i];
            }
        }
        return 0;
    }

三 运行结果

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值