思路:前一篇blog说过,遇到这种只有数字的数组,我们可以通过排序来改善数组。
而我们要找的长度为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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。