167 - 兩數之和 II - 輸入有序數組 - python

給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等於目標數。

函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。

說明:

返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。

示例:

輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 27 之和等於目標數 9 。因此 index1 = 1, index2 = 2

題目要求在數組中找兩個數使得兩數之和等於目標數,而且數組本身已經是升序排列的,因此我們可以做以下判斷:

  • 如果數組爲空,直接返回[]
  • 如果數組不爲空,但首元素已經大於目標數,則同樣返回[]
  • 否則需從數組中來兩個數看是否滿足要求
  1. 暴力法:依次從當前元素出發判斷後面是否有元素使得兩數之和爲目標數,簡單樣例可以過,但是提交會時間超過
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        if not numbers: return []
        if numbers[0] > target: return []

        # numbers中可能有重複元素
        res = []
        for i in range(len(numbers)):
            num = numbers[i]
            if num <= target:
                for j in range(i + 1, len(numbers)):
                    if num + numbers[j] == target:
                        return [i + 1, j + 1]
            else:
                return []
        
        return []

既然不能通過暴力比對來尋找,那麼換一種思路來解決問題。數組中另外一種常用的方法就是雙指針法,分別設置指針l和r指向數組兩端:

  • 如果numbers[l] + numbers[r] == target,那麼直接返回結果
  • 如果numbers[l] + numbers[r] > target,說明右端的數較大,則左移r
  • 否則說明左邊的數較小,則右移l
class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        if not numbers: return []
        if numbers[0] > target: return []

        # 雙指針
        l, r = 0, len(numbers) - 1
        while l <= r:
            if numbers[l] + numbers[r] == target:
                return [l + 1, r + 1]
            elif numbers[l] + numbers[r] > target:
                r -= 1
            elif numbers[l] + numbers[r] < target:
                l += 1

        return []

時間複雜度O(n)O(n).

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