输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
1、题目分析
找两个数之和等于目标值,和leetcode第一题一样,当然可以用那个方法解决,不过这个数组是递增的,因此可以想到用二分法去解决,因为是递增的还可以用双指针去解决这个问题。因此这个题目三个方法可以解决。
2、解题分析
- hash法
- 声明一个hash表
- 遍历数组如果该元素不在这个数组中就将target-value添加到hash表中
- 如果遍历到的元素在hash表中那么直接返回
- 否则返回空列表
- 双指针
- 初始化左右两个指针指向数组的左右两端
- 设两个指针指向的元素之和sum=nums[i]+nums[j]
- 如果sum>target;j-=1
- 如果sum=target直接返回
- 如果sum<target;i+=1
- 遍历+二分法
- 对整个数组进行遍历得到元素item
- temp = target-item
- 使用二分法在数组上进行查找是否有元素等于temp
- 如果等于就返回数组
- 如果不等于就跳出二分法遍历循环进行数组的继续遍历
3、代码
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 判断初始化的数组是不是满足条件
if not nums or len(nums)<2:
return []
i,j=0,len(nums)-1
while i<j:
temp = nums[i]+nums[j]
if temp==target:
return [nums[i],nums[j]]
elif temp>target:
j-=1
#去重,避免有重复的元素
while i<j and nums[j]==nums[j-1]:
j-=1
else:
i+=1
while i<j and nums[i]==nums[i+1]:
i+=1
return []
#声明一个hash表
dic = {}
for item in nums:
if item in dic:
return [item,dic[item]]
else:
dic[target-item]=item
return []
#二分法
for i in range(len(nums)):
temp = target-nums[i]
while i+1<len(nums)-1:
pass
总结:对于处理递增的数组时,一定考虑到二分法和双指针法。