1. 程式人生 > >leetcode15和leetcode16 講解和python實現

leetcode15和leetcode16 講解和python實現

leetcode15 題目

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

leetcode16 題目

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

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

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

為什麼把這兩個題目放在一起

   相信在你讀完這兩個題目後,會發現這兩個題目"非常相似"(前者的target=0 後者的targrt=target 都是三個數),同時肯定是需要一定的技巧的,是不能暴力求解的

大致說一下解題思路(至於實現細節和邊緣 大家自己看我的程式哈)

我們可以先對陣列進行排序,如果是計算兩個元素的和的話,我們會分別設定頭和尾兩個指標,向中間靠攏,那麼三個的話,我們只需要先對第一個數進行迴圈取值下標i,剩下的兩個指標分別指向i+1和陣列的最後一個元素,這樣的複雜度是 排序O(nlogn) + 查詢O(n^2) = O(n^2)。

程式解答 (可以直接跑起來)

leetcode 15

class Solution:
    @staticmethod
    def threeSum(nums):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums=sorted(nums)
        print(nums)
        ans=[]
        isVisted=[]
        for i,num_1 in enumerate(nums):
            if
num_1 in isVisted: continue else: isVisted.append(num_1) print(num_1) tmp=set() j=i+1 k=len(nums)-1 while j<k: num_2=nums[j] num_3=nums[k] sum=num_1+num_2+num_3 if sum==0: if len(tmp)>=1 and (num_2 in tmp): pass else: ans.append([num_1,num_2,num_3]) #沒有最小的 tmp.add(num_1) tmp.add(num_2) tmp.add(num_3) j+=1 k-=1 elif sum<0: j+=1 else: k-=1 return ans if __name__=="__main__": print(Solution.threeSum([0,0,0,0]))

leetcode 16

class Solution:
    @staticmethod
    def threeSumClosest(nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        nums=sorted(nums)
        flag=0
        ans=0
        for i,num_1 in enumerate(nums):
            j=i+1
            k=len(nums)-1
            while j<k:
                num_2=nums[j]
                num_3=nums[k]
                sum=num_1+num_2+num_3
                if flag==0:
                    flag=1
                    ans=sum
                if abs(sum-target)<abs(ans-target):
                    ans=sum
                if sum==target:
                    return ans #沒有最小的
                elif sum<target:
                    j+=1
                else:
                    k-=1
        return ans






if __name__=="__main__":
    print(Solution.threeSumClosest([-1,2,1,-4],1))