LeetCode 167. 兩數之和 II - 輸入有序陣列 | Python
阿新 • • 發佈:2020-07-20
167. 兩數之和 II - 輸入有序陣列
題目來源:力扣(LeetCode)
https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
題目
給定一個已按照升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。
函式應該返回這兩個下標值 index1
和 index2
,其中 index1
必須小於 index2
。
說明:
- 返回的下標值(
index1
和index2
)不是從零開始的。 - 你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例:
輸入: 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
實現結果
歡迎關注
公眾號 【書所集錄】