[LeetCode][Python]15. 三數(shù)之和

[LeetCode][Python]15. 三數(shù)之和

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

注意:答案中不可以包含重復(fù)的三元組。

例如, 給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],

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

解題思路:

  1. 暴力枚舉?
  2. 還是沒有思路
    參考別人:
    先將給定nums排序,簡化問題,復(fù)雜度為O(nlogn)。

令nums[k] + nums[i] + nums[j] == 0,找所有的組合的思路是:遍歷三個數(shù)字中最左數(shù)字的指針k,找到數(shù)組中所有不重復(fù)k對應(yīng)所有b c組合,即每指向新的nums[k],都通過雙指針法找到所有和為0的nums[i] nums[j]并記錄:

當(dāng)nums[k] > 0時,直接跳出,因?yàn)閖 > i > k,所有數(shù)字大于0,以后不可能找到組合了;

當(dāng)k > 0 and nums[k] == nums[k - 1],跳過此數(shù)字,因?yàn)閚ums[k - 1]的所有組合已經(jīng)被加入到結(jié)果,如果本次搜索,只會搜索到重復(fù)組合。

i, j分設(shè)在[k, len(nums)]兩端,根據(jù)sum與0的大小關(guān)系交替向中間逼近,如果遇到等于0的組合則加入res中,需要注意:移動i j需要跳過所有重復(fù)值,否則重復(fù)答案會被計入res。

先排序再查找nlogn快排,第一層循環(huán)從起點(diǎn)位置開始枚舉a,從剩余數(shù)組中查找b和c。因?yàn)橄扰判蛄?,所以b和c可以向中間靠攏。如果a+b+c>0,則c從最右端向左移動一位。如果a+b+c<0,則b從最左端向右移動一位??词欠竦扔?的情況。因?yàn)閎和c都是線性的往中間移動的,所以時間復(fù)雜度是O(N^2)。但是就地查找,沒有新開辟set空間,所以空間復(fù)雜度是O(1)。

    def threeSum2(self, nums):
        res = []
        nums.sort()
        for i in range(len(nums) - 2):
            if i > 0 and nums[i] == nums[i-1]:
                continue
            l, r = i+1, len(nums) - 1
            while l < r:
                s = nums[i] + nums[l] + nums[r]
                if s < 0:
                    l += 1 # 左邊界向右移動一步
                elif s > 0:
                    r -= 1 # 右邊界向左移動一步
                else:
                    res.append([nums[i], nums[l], nums[r]])
                    # 過濾重復(fù)的結(jié)果
                    while l < r and nums[l] == nums[l+1]:
                        l+=1
                    while l < r and nums[r-1] == nums[r]:
                        r -= 1
                    l += 1
                    r -= 1
        return res
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 需求 給定一個包含 n 個整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b...
    惑也閱讀 419評論 0 1
  • 題目鏈接難度:中等 類型: 數(shù)組 給定一個包含 n 個整數(shù)的數(shù)組 nums,判斷 nums 中...
    wzNote閱讀 3,783評論 0 1
  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,031評論 0 2
  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,531評論 0 13
  • 友人最近深為婚姻問題所困擾,于是見到我的時候像抓到稻草似地把苦水一吐為快。 友人與她丈夫是經(jīng)朋友介紹認(rèn)識的,在戀愛...
    大齡待業(yè)女青年閱讀 336評論 2 1

友情鏈接更多精彩內(nèi)容