《Leetcode》15. 三數之和

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

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

示例:

給定數組 nums = [-1, 0, 1, 2, -1, -4],

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

思路:

1、題目分析

在這個數組中找出三個數,這三個數之和是0。

2、解題分析

  • 先判斷數組長度,如果小於3直接返回空,如果不是則繼續處理
  • 對數組進升序排序,然後開始遍歷數組
    • 如果num[i]大於0直接返回res因爲;本來就是排序過的num[i+1]>num[i]。
    • 如果相鄰兩個數是一毛一樣的;那就continue
    • 設置左右邊界;然後一定滿足左邊界小於右邊界,否則直接返回res
      • 如果三個數之和等於0,添加到結果去然後再執行去重操作
        • 如果左邊的下個元素和當前元素一致那就向右移動
        • 如果右邊的下個元素和當前元素一致那就向左移動
        • 在執行左邊界+1;右邊界-1
      • 如果三個數之和大於0,將右邊界-1
      • 如果三個數之和小於0,將左邊界+1

第一次這樣寫算法流程,感覺這樣思路比較清晰一點,以後就這樣分析唄,上代碼:

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        res = []
        size = len(nums)
        #如果長度不滿足直接返回空
        if not nums or size<3:
            return res
        #對數組進行排序
        nums.sort()
        
        for i in range(len(nums)):
            #大於0直接返回
            if nums[i]>0:
                return res
            #去除重複的元素
            if i>0 and nums[i]==nums[i-1]:
                continue
            #設置左右邊界
            L=i+1
            R=size-1
            while L<R:
                #滿足結果直接添加到數組
                s = nums[i]+nums[L]+nums[R]
                if s==0:
                    res.append([nums[i],nums[L],nums[R]])
                    #去重
                    while L<R and nums[L+1]==nums[L] :
                        L=L+1
                    while L<R and nums[R-1]==nums[R]:
                        R=R-1
                    L=L+1
                    R=R-1
                #如果大於0右邊界減1
                elif s>0:
                    R=R-1
                #如果小於0左邊界加1
                else:
                    L=L+1
        return res

總結:兩數之和,固定一個去找另一個;三數之和,固定一個去找另外兩個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章