劍指offer 57 和為s的兩個數字

2021-10-03 14:09:04 字數 1890 閱讀 2804

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。

對列表中元素根據target計算餘數,判斷餘數是否在例表中,有則返回。

但時間複雜度高為o(n^2),當列表很大時,超出時間限制。

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

-> list[

int]

:for i in

range

(len

(nums)):

# 對列表元素計算餘數

rem = target - nums[i]

if self.dic.setdefault(rem)

:## 判斷餘數是否在列表內

return

[nums[i]

, rem]

# nums[i]一定比rem小,

時間複雜度為o(n),提交通過。

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

-> list[

int]

:# 建立dic加快搜尋

self.dic =

for i in

range

(len

(nums)):

self.dic[nums[i]

]= i

for i in

range

(len

(nums)):

rem = target - nums[i]

if self.dic.setdefault(rem)

:# 字典搜尋,判斷餘數是否在列表內

return

[nums[i]

, rem]

# nums[i]一定比rem小

抓住列表從小到大的規律,小數的rem大,應該從尾部開始搜尋。

乙個左指標從頭,乙個右指標從尾,計算所指兩個元素之和。若和小於targe,左指標右移;大於target,右指標左移;直到相等時返回。

左右指標相遇時跳出迴圈。

class

solution

:def

twosum

(self, nums: list[

int]

, target:

int)

-> list[

int]

: le =

0# 左指標起始位置

ri =

len(nums)-1

# 右指標起始位置

summ =

0while le < ri:

summ = nums[le]

+ nums[ri]

if summ == target:

return

[nums[le]

, nums[ri]

]elif summ < target:

le +=

1else

: ri -=

1

不用遍歷列表,時間減少很多。

劍指offer 57 和為S的兩個數

題目一 這道題題目為 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。解題思路分為三個步驟 1 對於已經排好序的陣列,先在陣列裡隨機選擇兩個數字,如果它們的和正好等於s,則輸出這兩個數字。2 如果隨機選擇的兩個數字和小於s,可...

劍指 Offer 57 和為s的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。示例 1 輸入 nums 2,7,11,15 target 9 輸出 2,7 或者 7,2 示例 2 輸入 nums 10,26,30,31,47,60 target 40 輸...

劍指 Offer 57 和為s的兩個數字

劍指 offer 57.和為s的兩個數字 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。示例 1 輸入 nums 2,7,11,15 target 9 輸出 2,7 或者 7,2 示例 2 輸入 nums 10,26,30...