让3岁小孩都能理解LeetCode每日一题_3132.找出与数组相加的整数II

在这里插入图片描述
在这里插入图片描述

思路:前一篇blog说过,遇到这种只有数字的数组,我们可以通过排序来改善数组

我们首先将数组 nums1和 nums2中的元素都升序排序。记它们的长度分别是 m 和 n,那么我们本质上需要找到一个长度为 n 的序列:
而我们要找的长度为n的序列就是取了n个位置上nums1中的值。每个值就是取自nums1[idi]的值。
注意id0,id1表示的是 nums1数组的下标,而id0其中的0是下标的下标。
所以也就是说长度为m的数组的所有下标中的n个下标的每个值其大小都大于等于零且小于m。
大于等于零很好理解,数组下标都是大于等于零的。小于m的意思是首先就算是一个数组长度为m,那他的下标最多也是取到m-1,所以sums1数组的下标就小于m。

在这里插入图片描述

它是严格递增的,就是说我们是按序从nums1中取得值,所以其下标也是严格递增的。
nums2[i]-nums1[idi]的值都是相同的,是因为题干中提到“执行了上述操作,nums1和nums2相等”,也就是说nums1去掉了两个数后,其每个位置与nums2相应位置的差值是相同的。所以nums2[i]-nums1[idi]的值都是相同的。
id0对应{0,1,2}中的一个是因为sums1要去掉两个数,对应其位置也就是去掉两个,而ido0如果对应比2大的数字,比如3,反证,那么说明n个数字的序列的第一个是取自sums1下标为3的位置,那样就去掉了三个位置(即{0,1,2}),是不对的。

在这里插入图片描述
因为nums1是有序的,所以nums1[2]比nums1[0]大,所以nums2[i]减去nums1[2]所得的x更小。
代码如下:

class Solution {
    public int minimumAddedInteger(int[] nums1, int[] nums2) {
        int m = nums1.length, n = nums2.length;
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        for (int i: new int[]{2, 1, 0}) {
            int left = i + 1, right = 1;
            while (left < m && right < n) {
                if (nums1[left] - nums2[right] == nums1[i] - nums2[0]) {
                    ++right;
                }
                ++left;
            }
            if (right == n) {
                return nums2[0] - nums1[i];
            }
        }
        // 本题不会有无解的情况
        return 0;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/find-the-integer-added-to-array-ii/solutions/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值