給定一個已按照升序排列 的有序數組,找到兩個數使得它們相加之和等於目標數。
函數應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。
說明:
返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重複使用相同的元素。
示例:
輸入: numbers = [2, 7, 11, 15], target = 9
輸出: [1,2]
解釋: 2 與 7 之和等於目標數 9 。因此 index1 = 1, index2 = 2 。
題目要求在數組中找兩個數使得兩數之和等於目標數,而且數組本身已經是升序排列的,因此我們可以做以下判斷:
- 如果數組爲空,直接返回
[]
- 如果數組不爲空,但首元素已經大於目標數,則同樣返回
[]
- 否則需從數組中來兩個數看是否滿足要求
- 暴力法:依次從當前元素出發判斷後面是否有元素使得兩數之和爲目標數,簡單樣例可以過,但是提交會時間超過
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 []
時間複雜度.