1. 程式人生 > 實用技巧 >LeetCode 167. 兩數之和 II - 輸入有序陣列 | Python

LeetCode 167. 兩數之和 II - 輸入有序陣列 | Python

167. 兩數之和 II - 輸入有序陣列


題目來源:力扣(LeetCode)
https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted

題目


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

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

說明:

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

示例:

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

解題思路


思路:雙指標

先審題,首先題目中所給的陣列是有序的,因為這個前提,我們可以考慮使用雙指標的思路,縮小範圍,進而求得答案。

這裡,先注意題目中所給出的要求:

  • 返回的下標值,並不是從零開始,而是從 1 開始
  • 題目有唯一解,所以求得答案可直接返回。

現在說下演算法的具體思路:

  • 定義雙指標 left, right,分別指向有序陣列的首尾;
  • 令兩個指標所對應的數字相加,設為 two_sum,與 target 進行比較:
    • two_sum == target,返回 [left + 1, right + 1]因為返回下標值從 1 開始
    • two_sum > target,則向前移動右指標;
    • two_sum < target,則向後移動左指標。

演算法實現的過程如下圖:

具體的程式碼實現如下。

程式碼實現


class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        length = len(numbers)
        # 定義雙指標,分別指向陣列首尾
        left = 0
        right = length - 1

        while left < right:
            # 令指標所對應的數字相加,與 target 作比較
            two_sum = numbers[left] + numbers[right]
            # 相等時,返回索引值,因為下標從 1 開始計算,要相應 +1
            if two_sum == target:
                return [left + 1, right + 1]
            # 兩數之和大於 target,移動右指標縮小兩數和
            elif two_sum > target:
                right -= 1
            # 兩數和小於 target,移動左指標增大兩數和
            else:
                left += 1

        return None

實現結果


歡迎關注


公眾號 【書所集錄