1. 程式人生 > >Lintcode 兩數之和 系列

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]