Easy
题目描述
给你两个长度相等的数组 nums1 和 nums2。
nums1 中的每个元素都增加了一个整数(如果是负数则为减少),用变量 x 表示。
结果,nums1 变得等于 nums2。当两个数组包含相同频次的相同整数时,认为它们相等。
返回整数 x。
示例 1:
输入:nums1 = [2,6,4], nums2 = [9,7,5]
输出:3
解释:nums1 的每个元素都增加了 3。
示例 2:
输入:nums1 = [10], nums2 = [5]
输出:-5
解释:nums1 的每个元素都增加了 -5。
示例 3:
输入:nums1 = [1,1,1,1], nums2 = [1,1,1,1]
输出:0
解释:nums1 的每个元素都增加了 0。
约束:
1 <= nums1.length == nums2.length <= 1000 <= nums1[i], nums2[i] <= 1000- 测试用例保证存在整数
x,使得nums1的每个元素都加上x后能等于nums2。
提示:
- 注意,对两个数组排序后,每个元素之间应该有一对一的对应关系。
- 因此
x = min(nums2) - min(nums1)。
解题思路
这道题的关键在于理解题目条件:nums1 中的每个元素都加上了相同的整数 x 后变成 nums2,且两个数组包含相同频次的相同整数。
思路分析
根据题目描述,我们知道存在一个整数 x,使得对 nums1 中每个元素加上 x 后得到的数组与 nums2 相等(元素相同且频次相同)。
方法一:直接计算差值
由于每个元素都加了相同的值,我们可以直接用任意一对对应元素的差值来计算 x。最简单的方法是使用第一个元素:x = nums2[0] - nums1[0]。
方法二:使用最小值(推荐)
根据提示,更稳妥的方法是使用最小值:x = min(nums2) - min(nums1)。这种方法在逻辑上更清晰,因为排序后的对应关系是确定的。
方法三:使用排序验证 可以先对两个数组排序,然后计算对应位置元素的差值,所有差值应该相等。
由于题目保证解的存在性,方法一和方法二都能得到正确答案。考虑到代码简洁性,推荐使用方法一。
代码实现
class Solution {
public:
int addedInteger(vector<int>& nums1, vector<int>& nums2) {
return nums2[0] - nums1[0];
}
};
class Solution:
def addedInteger(self, nums1: List[int], nums2: List[int]) -> int:
return nums2[0] - nums1[0]
public class Solution {
public int AddedInteger(int[] nums1, int[] nums2) {
return nums2[0] - nums1[0];
}
}
var addedInteger = function(nums1, nums2) {
return nums2[0] - nums1[0];
};
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 直接计算差值 | O(1) | O(1) |
| 使用最小值 | O(n) | O(1) |
| 排序验证 | O(n log n) | O(1) |