LeetCode16. python實現:最接近的三數之和問題☆☆

目錄

問題

解題思路

python具體實現

題外記


問題

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


例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.

與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).

解題思路

    分析:題目中有兩個關鍵信息:1)假定每組輸入只存在唯一答案;2)三個數的和與 target 最接近,返回這三個數的和

         這個問題的思考和LeetCode15題的三數之和非常類似,解題方法也類同博文:https://blog.csdn.net/weixin_42521211/article/details/88189536。不過這道題相對來說,更簡單,因爲限制了唯一,並且只需要返回三個數的和。

    具體步驟

    1)先對數組進行排序,預設一個差值最小的數targetDiff(2**31-1),一個數組result來存儲三個數的下標;

    2)第一層循環遍歷數組,第二層循環藉助雙指針遍歷思想,如果三數和與target差值等於0,則可以直接返回三數和:target;否則,判斷當前的三數之和與target的差值的絕對值與targetDiff比較,讓targetDiff保存當前差值最小的數,如果targetDiff值進行了更新,則result也進行更新,存儲當前的三個數的下標。

    3)返回結果。最後,result記錄的即爲三個數在nums中的下標,因此取出求和即可。

詳細實現代碼如下:


python具體實現

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        numLen = len(nums) 
        
        # 特殊情況的處理:數組個數小於3 及 等於 3的情況
        if numLen<3:
            return 0
        #if numLen== 3:
            #return sum(nums)
        
        nums.sort()  # 數組排序
        result = []
        targetDiff = 2**31-1 # 初始預設的最大差值
        
        for i in range(numLen):
            # 雙指針實現
            left = i+1
            right = numLen-1
            while left<right:
                temp = nums[i]+nums[left]+nums[right]-target
                if temp ==0:
                    return target
                
                abstemp = abs(temp)
                if abstemp<targetDiff:
                    result = [i,left,right]
                    targetDiff = abstemp
                    
                if temp>0:
                    right = right-1
                else:
                    left = left+1

        return nums[result[0]]+nums[result[1]]+nums[result[2]]

題外記

    有了之前“三數之和”的實現經歷,完成這道題,就是小菜一碟了吧。(小嘚瑟下)

發佈了69 篇原創文章 · 獲贊 19 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章