目标
给你两个长度相等的数组 nums1 和 nums2。
数组 nums1 中的每个元素都与变量 x 所表示的整数相加。如果 x 为负数,则表现为元素值的减少。
在与 x 相加后,nums1 和 nums2 相等 。当两个数组中包含相同的整数,并且这些整数出现的频次相同时,两个数组 相等 。
返回整数 x 。
示例 1:
输入:nums1 = [2,6,4], nums2 = [9,7,5]
输出:3
解释:与 3 相加后,nums1 和 nums2 相等。
示例 2:
输入:nums1 = [10], nums2 = [5]
输出:-5
解释:与 -5 相加后,nums1 和 nums2 相等。
示例 3:
输入:nums1 = [1,1,1,1], nums2 = [1,1,1,1]
输出:0
解释:与 0 相加后,nums1 和 nums2 相等。
说明:
- 1 <= nums1.length == nums2.length <= 100
- 0 <= nums1[i], nums2[i] <= 1000
- 测试用例以这样的方式生成:存在一个整数 x,使得 nums1 中的每个元素都与 x 相加后,nums1 与 nums2 相等。
思路
有两个整数数组 nums1
和 nums2
,nums1
中的每个元素加上 x
之后可以通过调整元素位置得到 nums2
,求 x
。
从 nums1
到 nums2
的映射为双射,即单射和满射。为了求 x
我们只需要找到 nums1
和 nums2
的最大值或最小值即可。
还有网友对两个数组求和,相减后再除以数组长度,不过需要注意数据溢出、数据类型的问题。
代码
/**
* @date 2024-08-08 9:11
*/
public class AddedInteger3131 {
public int addedInteger(int[] nums1, int[] nums2) {
int n = nums1.length;
int max1 = nums1[0];
int max2 = nums2[0];
for (int i = 1; i < n; i++) {
if (max1 < nums1[i]) {
max1 = nums1[i];
}
if (max2 < nums2[i]) {
max2 = nums2[i];
}
}
return max2 - max1;
}
}