[Leetcode]18. 四數(shù)之和

給定一個包含 n 個整數(shù)的數(shù)組 nums 和一個目標(biāo)值 target镜豹,判斷 nums 中是否存在四個元素 a份企,b,c 和 d 撇贺,使得 a + b + c + d 的值與 target 相等赌莺?找出所有滿足條件且不重復(fù)的四元組。

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

示例:

給定數(shù)組 nums = [1, 0, -1, 0, -2, 2]艘狭,和 target = 0。

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

我的方法:

總的思路與3Sum()類似翠订,也是用循環(huán)+雙指針巢音,只不過這里使用的是雙重循環(huán)。同樣的尽超,在處理時應(yīng)該注意以下兩個方面:

  1. 注意剔除重復(fù)項官撼。
  2. 當(dāng)找到滿足條件的項目時,不要忘了移動k,l似谁,否則會進(jìn)入死循環(huán)歧寺。

執(zhí)行效率一般:執(zhí)行用時 : 860 ms, 在4Sum的Python提交中擊敗了20.70% 的用戶。內(nèi)存消耗 : 10.7 MB, 在4Sum的Python提交中擊敗了14.94% 的用戶棘脐。

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        nums.sort()
        leng=len(nums)# 數(shù)組長度
        ans=[]
        if len(nums)<4:
            return []
        # 雙重循環(huán)
        for i in range(leng-3):
            for j in range(i+1,leng-2):
                k=j+1
                l=leng-1
                # k,l移動的條件
                if i==0 or nums[i]!=nums[i-1]:
                    while k<l:
                        if nums[i]+nums[j]+nums[k]+nums[l]>target:
                            l-=1
                        elif nums[i]+nums[j]+nums[k]+nums[l]<target:
                            k+=1
                        else:
                            # 注意剔除重復(fù)項
                            if [nums[i],nums[j],nums[k],nums[l]] not in ans:
                                ans.append([nums[i],nums[j],nums[k],nums[l]])
                            # 不要忘了移動k,l
                            k+=1
                            l-=1
        return ans

別人的方法:
這套方法看起來有點(diǎn)意思斜筐,基本思想是用遞歸把NSum轉(zhuǎn)換為2Sum。還有其它有意思的點(diǎn):

  1. 直接用results記錄結(jié)果蛀缝,子函數(shù)findNsum()中的return并不實際返回值顷链,只是相當(dāng)于break的功能。
  2. 依然是要先對nums排序屈梁,排序之后很多事情都好辦多了嗤练,比如:判斷什么情況下就不用再接著計算了。
  3. findNsum函數(shù)中的nums表示數(shù)組在讶,target表示目標(biāo)值煞抬,N表示相加的數(shù)字個數(shù),result表示results[0]构哺,results表示最終結(jié)果革答。

速度果然快了許多:執(zhí)行用時 : 124 ms, 在4Sum的Python提交中擊敗了84.18% 的用戶。內(nèi)存消耗 : 10.7 MB, 在4Sum的Python提交中擊敗了14.94% 的用戶曙强。但遞歸應(yīng)該不是速度更快的原因残拐,應(yīng)該是其中做了很多的跳過操作,節(jié)省了不少的時間碟嘴。

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """ 
        nums.sort()
        results = []
        self.findNsum(nums, target, 4, [], results)
        return results
    def findNsum(self, nums, target, N, result, results):
        if len(nums) < N or N < 2: return

        # solve 2-sum
        if N == 2:
            l,r = 0,len(nums)-1
            while l < r:
                if nums[l] + nums[r] == target:
                    results.append(result + [nums[l], nums[r]])
                    l += 1
                    r -= 1
                    # 去重的方式很獨(dú)特
                    while l < r and nums[l] == nums[l - 1]:
                        l += 1
                    while r > l and nums[r] == nums[r + 1]:
                        r -= 1
                elif nums[l] + nums[r] < target:
                    l += 1
                else:
                    r -= 1
        else:
            for i in range(0, len(nums)-N+1):   # careful about range
                if target < nums[i]*N or target > nums[-1]*N:  # take advantages of sorted list
                    break
                if i == 0 or i > 0 and nums[i-1] != nums[i]:  # recursively reduce N
                    self.findNsum(nums[i+1:], target-nums[i], N-1, result+[nums[i]], results)
        return
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溪食,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子娜扇,更是在濱河造成了極大的恐慌错沃,老刑警劉巖栅组,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枢析,居然都是意外死亡玉掸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門登疗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來排截,“玉大人嫌蚤,你說我怎么就攤上這事辐益。” “怎么了脱吱?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵智政,是天一觀的道長。 經(jīng)常有香客問我箱蝠,道長续捂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任宦搬,我火速辦了婚禮牙瓢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘间校。我一直安慰自己矾克,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布憔足。 她就那樣靜靜地躺著胁附,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滓彰。 梳的紋絲不亂的頭發(fā)上控妻,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機(jī)與錄音揭绑,去河邊找鬼弓候。 笑死,一個胖子當(dāng)著我的面吹牛他匪,可吹牛的內(nèi)容都是我干的弓叛。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼诚纸,長吁一口氣:“原來是場噩夢啊……” “哼撰筷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起畦徘,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤毕籽,失蹤者是張志新(化名)和其女友劉穎抬闯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體关筒,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溶握,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒸播。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睡榆。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袍榆,靈堂內(nèi)的尸體忽然破棺而出胀屿,到底是詐尸還是另有隱情,我是刑警寧澤包雀,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布宿崭,位于F島的核電站,受9級特大地震影響才写,放射性物質(zhì)發(fā)生泄漏葡兑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一赞草、第九天 我趴在偏房一處隱蔽的房頂上張望讹堤。 院中可真熱鬧,春花似錦厨疙、人聲如沸洲守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岖沛。三九已至,卻和暖如春搭独,著一層夾襖步出監(jiān)牢的瞬間婴削,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工牙肝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唉俗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓配椭,卻偏偏與公主長得像虫溜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子股缸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容