LeetCode167 Two Sum II - Input array is sorted-python(easy)

題目來源

https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/discuss/51249/Python-different-solutions-(two-pointer-dictionary-binary-search).

題目分析

  給定一個已經按升序排序的整數數組,在其中找到兩個數,使他們加起來爲目標數值,最後返回這兩個數的索引。返回的第一個索引需要小於第二個索引,並且索引是從1開始計算的。注意每個情況只有一組解,並且不能使用相同的元素兩次。

  這個題目的第一種思路是遍歷,因爲已經排好序了,則前後兩值相加,與目標值比大小,進行相應的調整。這裏始終應該注意首部的“指針”不能超過尾部的“指針”,因此遍歷過程需要用while而不是for循環。

  此時實現的代碼爲:

class Solution:
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        i=0
        j=len(numbers)-1
        while(i<j):
            if(numbers[i]+numbers[j]<target):
                i+=1
            elif(numbers[i]+numbers[j]>target):
                j-=1
            else:
                return [i+1,j+1]

 第二種思路使用了字典,利用了字典其中的enumerate()內置函數,這個函數在先前也有所涉及,對於一個可迭代的(iterable)/可遍歷的對象(如列表、字符串),enumerate將其組成一個索引序列,利用它可以同時獲得索引和值,enumerate多用於在for循環中得到計數。因爲這裏我們是需要先比較值,然後得到它的索引,所以可以考慮這種思路。其代碼如下:

class Solution:
    def twoSum(self, numbers, target):
        """
        :type numbers: List[int]
        :type target: int
        :rtype: List[int]
        """
        dic={}
        for i,number in enumerate(numbers):
            if((target-number) in dic):
                return [dic[target-number]+1,i+1]
            dic[number]=i

 需要注意的是將列表中的元素放入字典時,是將值作爲下標,將下標作爲值,這樣做時有一定意義的。如果反向了,即使你得到了相對應的值,你也無法知道它的下標是多少,所以這裏一定要注意。

  還有一種思路是二分法查找,它主要應用於已經排序好的數組之中。其大致的思想爲:首先將給定值key與字典中間位置上元素的關鍵碼(key)比較,如果相等,則檢索成功;否則,若key小,則在字典前半部分中繼續進行二分法檢索;若key大,則在字典後半部分中繼續進行二分法檢索。這樣,經過一次比較就縮小一半的檢索區間,如此進行下去,直到檢索成功或檢索失敗。偶數個取中間2個其中任何一個作爲中間元素。二分法檢索是一種效率較高的檢索方法,要求字典在順序表中按關鍵碼排序。但是這裏是要我們將兩者的和與target比較而不是單一的元素,所以有些複雜。別人的代碼如下:

def twoSum(self, numbers, target):
    for i in xrange(len(numbers)):
        l, r = i+1, len(numbers)-1
        tmp = target - numbers[i]
        while l <= r:
            mid = l + (r-l)//2
            if numbers[mid] == tmp:
                return [i+1, mid+1]
            elif numbers[mid] < tmp:
                l = mid+1
            else:
                r = mid-1

注意這裏它不是和target比較,而是將其化成和其中某個元素進行比較。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章