Lintcode 56 两数之和
给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
样例
给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
分析:
这题目很简单,两数之间已经有了确定的映射关系,直接用哈希表(字典)就可以解决
def twoSum(numbers, target):
d={}
for i in range(len(numbers)):
if target-numbers[i] in d:
return [d[target-numbers[i]],i]
d[numbers[i]]=i
return [-1,-1]
443 两数之和II
描述
给一组整数,问能找出多少对整数,他们的和大于一个给定的目标值。
样例
对于 numbers = [2, 7, 11, 15], target = 24 的情况,返回 1。因为只有11 + 15可以大于24。
分析:
在进行数组排序后,首先选择第一个和最后一个元素,如果不大于给定值,就将第一个元素换成第二个元素(此时表明,共有n-1对元素之和大于给定值,分别是最后一个元素和之前所有元素分别组对),如果大于给定值,就将最后一个元素换成倒数第二个元素…
def twoSum2(nums, target):
# write your code here
nums.sort()
l,r=0,len(nums)-1
count=0
while l<r:
if nums[l]+nums[r]>target:
count=count+r-l
r=r-1
else:
l=l+1
return count
两数之和III Lintcode 609
给定一个整数数组,找出这个数组中有多少对的和是小于或等于目标值。返回对数。
样例
给定数组为 [2,7,11,15],目标值为 24
返回 5。
2+7<24
2+11<24
2+15<24
7+11<24
7+15<24
分析:
思路跟两数之和大于某一个数是一样的
def twoSum5(nums, target):
# write your code here
nums.sort()
l,r=0,len(nums)-1
count=0
while l<r:
if nums[l]+nums[r]<=target:
count=count+r-l
l=l+1
else:
r=r-1
return count
两数之和II III的拓展
在两数之和II中我们要求大于target的两个数的对数,在两数之和III中我们要求小于等于target的对数。
如果我们要求返回所有满族条件的pair呢?
Lintcode 610 两数之和 差等于目标值
描述
给定一个整数数组,找到两个数的 差 等于目标值。index1必须小于index2。注意返回的index1和index2不是 0-based。
样例
给定的数组为 [2,7,15,24],目标值为 5,返回 [1,2] (7 - 2 = 5)
分析:
跟两数字和等于目标值的思路一样,利用一个哈希表来解决。
def twoSum7(nums, target):
# write your code here
d={}
for i in range(len(nums)):
if nums[i]-target in d :
return [d[nums[i]-target]+1, i+1]
elif nums[i]+target in d :
return [d[nums[i]+target]+1, i+1]
d[nums[i]]=i
return[-1,-1]