代碼隨想錄算法訓練營第七天|454. 四數(shù)相加 II、383. 贖金信 吱窝、15. 三數(shù)之和讥邻、18. 四數(shù)之和

454. 四數(shù)相加 II - 力扣(LeetCode)

解題思路

兩數(shù)之和之不去重plus版
因為用存兩數(shù)之和出現(xiàn)的次數(shù),所以要用字典院峡;不用數(shù)組是因為int可能會很大兴使,用數(shù)組映射不合適。

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        hashtable1 = {}
        for i in range(len(nums1)):
            for j in range(len(nums2)):
                if nums1[i]+nums2[j] in hashtable1:
                    hashtable1[nums1[i]+nums2[j]] += 1
                else:
                    hashtable1[nums1[i]+nums2[j]] = 1

        count = 0
        for i in range(len(nums3)):
            for j in range(len(nums4)):
                if -(nums3[i]+nums4[j]) in hashtable1:
                    count += hashtable1[-(nums3[i]+nums4[j])]

        return count
  • 中間的運算結果可以用中間值存放照激,不然看起來繁瑣

383. 贖金信 - 力扣(LeetCode)

解題思路

magazine存到hashtable鲫惶,ransomNote遍歷,有一個對應的实抡,magazine就-1,沒找到或者找到對應的值為0欢策,就返回False

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        hashtable = {}
        for ch in magazine:
            if ch in hashtable:
                hashtable[ch] += 1
            else:
                hashtable[ch] = 1
        
        for ch in ransomNote:
            if ch not in hashtable or hashtable[ch] == 0:
                return False
            else:
                hashtable[ch] -= 1
        return True

15. 三數(shù)之和 - 力扣(LeetCode)

解題思路

  • 雙指針吆寨,排序,固定一位踩寇,然后移動左右指針啄清;
  • 去重是關鍵,abc都要去重俺孙。
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()

        result = []

        for i in range(len(nums)):
            if nums[i] > 0:
                return result

            if i>0 and nums[i] == nums[i-1]: #如果和上一個i對應的值一樣辣卒,跳過,不能是下一個
                continue

            left = i+1 #
            right = len(nums)-1

            while left < right:
                if (nums[i]+nums[left]+nums[right]) > 0:
                    right -= 1
                elif(nums[i]+nums[left]+nums[right]) < 0:
                    left += 1
                else:
                    result.append([nums[i], nums[left], nums[right]])

                    left += 1
                    right -= 1

                    while (left < right) and nums[left] == nums[left-1]:
                        left += 1 # 不能用if睛榄,不然只能去一個重復的
                    while (left < right) and nums[right] == nums[right+1]:
                        right -= 1
        return result

18. 四數(shù)之和 - 力扣(LeetCode)

解題思路

三數(shù)之和plus版荣茫,注意去重和剪枝

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        nums.sort()
        result = []

        for k in range(len(nums)):
            if target > 0 and nums[k] > target: #一級剪枝
                break

            if k>0 and nums[k] == nums[k-1]: #一級去重
                continue
            
            for i in range(k+1, len(nums)): 
                if target > 0 and nums[k]+nums[i] > target:#二級剪枝
                    break

                if i>k+1 and nums[i] == nums[i-1]: #二級去重
                    continue

                left = i+1
                right = len(nums)-1
                
                while left < right:
                    sums = nums[k] + nums[i] + nums[left] + nums[right]
                    if sums > target:
                        right -= 1
                    elif sums < target:
                        left += 1
                    else: 
                        result.append([nums[k],nums[i],nums[left],nums[right]])
                    
                        left += 1
                        right -= 1

                        while left < right and nums[left] == nums[left-1]:
                            left += 1
                        while left < right and nums[right] == nums[right+1]:
                            right -= 1

        return result     
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市场靴,隨后出現(xiàn)的幾起案子啡莉,更是在濱河造成了極大的恐慌港准,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咧欣,死亡現(xiàn)場離奇詭異浅缸,居然都是意外死亡,警方通過查閱死者的電腦和手機魄咕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門衩椒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哮兰,你說我怎么就攤上這事毛萌。” “怎么了奠蹬?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵朝聋,是天一觀的道長。 經(jīng)常有香客問我囤躁,道長冀痕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任狸演,我火速辦了婚禮言蛇,結果婚禮上,老公的妹妹穿的比我還像新娘宵距。我一直安慰自己腊尚,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布满哪。 她就那樣靜靜地躺著婿斥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哨鸭。 梳的紋絲不亂的頭發(fā)上民宿,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音像鸡,去河邊找鬼活鹰。 笑死,一個胖子當著我的面吹牛只估,可吹牛的內(nèi)容都是我干的志群。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蛔钙,長吁一口氣:“原來是場噩夢啊……” “哼锌云!你這毒婦竟也來了?” 一聲冷哼從身側響起吁脱,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤宾抓,失蹤者是張志新(化名)和其女友劉穎子漩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體石洗,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡幢泼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讲衫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缕棵。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涉兽,靈堂內(nèi)的尸體忽然破棺而出招驴,到底是詐尸還是另有隱情,我是刑警寧澤枷畏,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布别厘,位于F島的核電站,受9級特大地震影響拥诡,放射性物質(zhì)發(fā)生泄漏触趴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一渴肉、第九天 我趴在偏房一處隱蔽的房頂上張望冗懦。 院中可真熱鬧,春花似錦仇祭、人聲如沸披蕉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽没讲。三九已至,卻和暖如春礁苗,著一層夾襖步出監(jiān)牢的瞬間爬凑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工寂屏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娜搂。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓迁霎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親百宇。 傳聞我的和親對象是個殘疾皇子考廉,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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