Lintcode 两数之和 系列

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值