1. 程式人生 > 其它 >leetcode16-最接近的三數之和-基於python

leetcode16-最接近的三數之和-基於python

技術標籤:leetcodeleetcode演算法python

leetcode16-最接近的三數之和-基於python

leetcode16-最接近的三數之和-基於python

1、題目

給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target
最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
在這裡插入圖片描述

2、解析

  1. 標籤:排序和雙指標
  2. 本題目因為要計算三個數,如果靠暴力列舉的話時間複雜度會到 O(n^3),需要降低時間複雜度
  3. 首先進行陣列排序,時間複雜度 O(nlogn)
  4. 在陣列 nums 中,進行遍歷,每遍歷一個值利用其下標i,形成一個固定值 nums[i]
  5. 再使用前指標指向 start = i + 1 處,後指標指向 end = nums.length - 1 處,也就是結尾處
  6. 根據 s = nums[i] + nums[start] + nums[end] 的結果,判斷 s 與目標 target 的距離,如果更近則更新結果 best
  7. 同時判斷 sum 與 target 的大小關係,因為陣列有序,如果 sum > target 則 end–,如果 sum < target 則 start++,如果 sum == target 則說明距離為 0 直接返回結果
  8. 整個遍歷過程,固定值為 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