leetcode16-最接近的三數之和-基於python
阿新 • • 發佈:2021-02-06
技術標籤:leetcodeleetcode演算法python
leetcode16-最接近的三數之和-基於python
leetcode16-最接近的三數之和-基於python
1、題目
給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target
最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
2、解析
- 標籤:排序和雙指標
- 本題目因為要計算三個數,如果靠暴力列舉的話時間複雜度會到 O(n^3),需要降低時間複雜度
- 首先進行陣列排序,時間複雜度 O(nlogn)
- 在陣列 nums 中,進行遍歷,每遍歷一個值利用其下標i,形成一個固定值 nums[i]
- 再使用前指標指向 start = i + 1 處,後指標指向 end = nums.length - 1 處,也就是結尾處
- 根據 s = nums[i] + nums[start] + nums[end] 的結果,判斷 s 與目標 target 的距離,如果更近則更新結果 best
- 同時判斷 sum 與 target 的大小關係,因為陣列有序,如果 sum > target 則 end–,如果 sum < target 則 start++,如果 sum == target 則說明距離為 0 直接返回結果
- 整個遍歷過程,固定值為 n 次,雙指標為 n 次,時間複雜度為 O(n^2)
總時間複雜度:O(nlogn) + O(n^2)
3、程式碼
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
#本題採用排序加雙指標的做法
nums.sort()#sort()預設降序
n = len(nums)
#一開始給一個最大數
best = 10000
#根據絕對值進行比較
def update (cur):
nonlocal best
if abs(cur-target) < abs(best-target):
best = cur
return best
for i in range(n):
if i > 0 and nums[i] == nums[i-1]:
continue
j,k = i+1 , n - 1
while j < k:
s = nums[i] + nums[j] + nums[k]
if s == target:
return target
update(s)
if s < target:
j +=1
else:
k -=1
return best
4、知識點
1:雙指標經常被用到,需要熟記
2:nonlocal
nonlocal宣告的變數不是區域性變數,也不是全域性變數,而是外部巢狀函式內的變數。
詳細見:https://blog.csdn.net/qq_42780289/article/details/89244761