本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教.
1.题干
给你两个整数数组
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
相等。提示:
3 <= nums1.length <= 200
nums2.length == nums1.length - 2
0 <= nums1[i], nums2[i] <= 1000
- 测试用例以这样的方式生成:存在一个整数
x
,nums1
中的每个元素都与x
相加后,再移除两个元素,nums1
可以与nums2
相等。
2.思考
最开始的想法,是找到数组1和数组2之间差值的规律,就是想维护两个差值数组,找到需要排除掉的元素之后,再进行计算,后来没成功,选择了维护两个数组的下标进行暴力模拟遍历,思路如代码中的注释.
3.代码
from typing import List
class Solution:
def minimumAddedInteger(self, nums1: List[int], nums2: List[int]) -> int:
nums1.sort(reverse=True)
nums2.sort(reverse=True)
n1, index1, n2, index2 = len(nums1), 1, len(nums2), 1
skip, skip_count = 0, 0
# 循环边界
while index1 < n1 and index2 < n2:
# 计算首个元素的差值
dif = nums2[0] - nums1[skip_count]
# 比较之后元素的差值
dif_now = nums2[index2] - nums1[index1]
# 差值相等 继续往下遍历
if dif_now == dif:
index1 += 1
index2 += 1
# 差值不等
else:
# 跳过nums1当前的元素
index1 += 1
# 跳过次数+1
skip += 1
# 当跳过次数超限时
if skip > 2:
# 从头开始 nums2回到首个元素
index2 = 0
# 从头开始次数+1
skip_count += 1
# 跳过nums1的首元素
index1 = skip_count
# 跳过次数等于从头开始次数
skip = skip_count
# 如果有一方走到最后 计算结果
if index1 == n1 or index2 == n2:
return nums2[index2 - 1] - nums1[index1 - 1]
if __name__ == "__main__":
solution = Solution()
nums1 = [3, 0, 3, 5, 3]
nums2 = [10, 10, 10]
print(solution.minimumAddedInteger(nums1, nums2))
4.总结
感觉应该有其他的解法,后续看题解继续学习.