题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例
输入:nums = [3,2,4], target = 6
输出:[1,2]
解法1:暴力枚举
伪代码
下标x和从下标x之后的数,计算两者之和比较target值
python代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
ans=[]
for i in range(len(nums)):
for j in range(i,len(nums)):
if nums[i]+nums[j]==target:
s=[i,j]
if s[0]!=s[1]:
ans.append(s)
return ans[0]
解法2:哈希表
伪代码
两个元素x,y必然是一前一后出现的,如果存在符合条件的解,在遍历到x时,哈希表里没有符合的y,此时把x加入到了哈希表里,当遍历到y时,就可以在哈希表里找到对应的x了,所以只需要一次遍历
python代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
ans=[]
i=0
while i<len(nums):
if target-nums[i] not in ans:
ans.append(nums[i])
else:
x=ans.index(target-nums[i])
y=i
return [x,y]
i+=1
哈希表在数组查找元素的应用很常见
合并两个有序数组
题目
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
示例
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
解法1:直接合并然后排序
python代码
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
for i in range(n):
nums1.pop()
for i in range(n):
nums1.append(nums2[i])
nums1.sort()
解法2:双指针
伪代码
利用两个数组都是非递减整数排列
python代码
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1=0
p2=0
ans=[]
while p1<m or p2<n:
if p1==m:
ans.append(nums2[p2])
p2+=1
elif p2==n:
ans.append(nums1[p1])
p1+=1
elif nums1[p1]<=nums2[p2]:
ans.append(nums1[p1])
p1+=1
elif nums1[p1]>nums2[p2]:
ans.append(nums2[p2])
p2+=1
for i in range(m+n):
nums1[i]=ans[i]
解法3:逆向双指针
伪代码
nums1后半段是空的,可直接覆盖不影响
事实上,在这个遍历的任何时刻,nums1有m-p1-1个元素放如nums1后半段,nums2有n-p2-1个元素放入nums1后半段,nums1后半段的空间m+n-p1-1
任何时刻都是成立的
python代码
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
p1=m-1
p2=n-1
i=0
while p1>=0 or p2>=0:
if p1==-1:
nums1[m+n-1-i]=nums2[p2]
p2-=1
elif p2==-1:
nums1[m+n-1-i]=nums1[p1]
p1-=1
elif nums1[p1]>=nums2[p2]:
nums1[m+n-1-i]=nums1[p1]
p1-=1
elif nums1[p1]<nums2[p2]:
nums1[m+n-1-i]=nums2[p2]
p2-=1
i+=1