LeetCode 记录
前言
从入门到“不放弃”
一、找出与数组相加的数 (2024.8.9)
题目:
给你两个整数数组 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 相等。
思想:先排序,nums1 前三个值中,必定有一个是保留下来的,从大到小来假设保留的值,因为要取最小整数 x。对nums1+x后,看nums2是不是nums1的子序列就行。是的话,就移除其余两个值。直到最后,剩余nums1[0]后,就不用判断了,因为此题必有解,直接相减得到x即可。
判断子序列方法
判断s是不是t的子序列
假设i,j分别指向s,t的初始位置,若匹配i+1,否则j+1
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
n, m = len(s), len(t)
i = j = 0
while i < n and j < m:
if s[i] == t[j]:
i += 1
j += 1
return i == n
原题目Python 代码:
class Solution:
def minimumAddedInteger(self, nums1: List[int], nums2: List[int]) -> int:
nums1.sort()
nums2.sort()
# 枚举保留 nums1[2] 或者 nums1[1] 或者 nums1[0]
# 倒着枚举是因为 nums1[i] 越大答案越小,第一个满足的就是答案
for i in range(2, 0, -1):
x = nums2[0] - nums1[i]
# 在 {nums1[i] + x} 中找子序列 nums2
j = 0
for v in nums1[i:]:
if nums2[j] == v + x:
j += 1
# nums2 是 {nums1[i] + x} 的子序列
if j == len(nums2):
return x
# 题目保证答案一定存在
return nums2[0] - nums1[0]
总结
革命尚未成功,同志还需努力!