力扣.018 四數(shù)之和 four-sum

數(shù)組系列

力扣數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組-00-概覽

力扣.53 最大子數(shù)組和 maximum-subarray

力扣.128 最長(zhǎng)連續(xù)序列 longest-consecutive-sequence

力扣.1 兩數(shù)之和 N 種解法 two-sum

力扣.167 兩數(shù)之和 II two-sum-ii

力扣.170 兩數(shù)之和 III two-sum-iii

力扣.653 兩數(shù)之和 IV two-sum-IV

力扣.015 三數(shù)之和 three-sum

力扣.016 最接近的三數(shù)之和 three-sum-closest

力扣.259 較小的三數(shù)之和 three-sum-smaller

力扣.018 四數(shù)之和 four-sum

力扣.454 四數(shù)相加之和 II

題目

給你一個(gè)由 n 個(gè)整數(shù)組成的數(shù)組 nums 苦银,和一個(gè)目標(biāo)值 target 植捎。

請(qǐng)你找出并返回滿足下述全部條件且不重復(fù)的四元組 [nums[a], nums[b], nums[c], nums[d]] (若兩個(gè)四元組元素一一對(duì)應(yīng)典尾,則認(rèn)為兩個(gè)四元組重復(fù)):

0 <= a, b, c, d < n

a肿嘲、b敲董、c 和 d 互不相同

nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意順序 返回答案 瓦糕。

示例 1:

輸入:nums = [1,0,-1,0,-2,2], target = 0
輸出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

輸入:nums = [2,2,2,2,2], target = 8
輸出:[[2,2,2,2]]

提示:

1 <= nums.length <= 200

-10^9 <= nums[i] <= 10^9

-10^9 <= target <= 10^9

整體思路

結(jié)合前面我們做 2sum 3sum 的經(jīng)驗(yàn)种远,可能的方式:

  1. 暴力

  2. 排序+二分

  3. 排序+雙指針

  4. Hash 優(yōu)化(局限性比較大)

v1-暴力

思路

直接 4 次 循環(huán)蜜徽,雖然知道等待我們的一定是超時(shí)祝懂。

實(shí)現(xiàn)

public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        // 暴力
        int count = 0;
        for(int i = 0; i < nums1.length; i++) {
            for(int j = 0; j < nums2.length; j++) {
                for(int k = 0; k < nums3.length; k++) {
                    for(int l = 0; l < nums4.length; l++) {
                        int sum = nums1[i] + nums2[j] + nums3[k] + nums4[l];
                        if(sum == 0) {
                            count++;
                        }
                    }
                }
            }
        }
        return count;
    }

效果

超出時(shí)間限制

288 / 294 個(gè)通過的測(cè)試用例

小結(jié)

4 次循環(huán)容易想到。但是會(huì)慢在 2 個(gè)地方:

v2-排序+雙指針

思路

結(jié)合我們前面 T015 的方式:

首先固定兩個(gè)位置拘鞋,然后剩下的部分采用雙指針砚蓬。

注意點(diǎn):

1)需要排除元素的重復(fù)情況

2)固定的 i, j 前兩個(gè)元素都要排除。

其中避免 i 重復(fù)時(shí)盆色,i > 0 && nums[i] == nums[i-1] 跳過

其中避免 j 重復(fù)時(shí)灰蛙,j > i+1 && nums[j] == nums[j-1] 跳過

實(shí)現(xiàn)

class Solution {
    
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);

        List<List<Integer>> res = new ArrayList<>();

        final int n = nums.length;
        for(int i = 0; i < n-3; i++) {
            // 跳過重復(fù)的元素
            if(i > 0 && nums[i] == nums[i-1]) {
                continue;
            }
            for(int j = i+1; j < n-2; j++) {
                if(j > i+1 && nums[j] == nums[j-1]) {
                    continue;
                }

                // 雙指針
                int left = j+1;
                int right = n-1;

                while (left < right) {
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];

                    if(sum == target) {
                        // 跳過后續(xù)可能重復(fù)的數(shù)據(jù)
                        List<Integer> list = Arrays.asList(nums[i], nums[j], nums[left], nums[right]);
                        res.add(list);

                        // 考慮左邊
                        while (left < right && nums[left] == nums[left+1]) {
                            left++;
                        }
                        // 右邊
                        while (left < right && nums[right] == nums[right-1]) {
                            right--;
                        }
                    }

                    if(sum < target) {
                        left++;
                    } else {
                        right--;
                    }
                }
            }
        }

        return res;
    }
}

效果

解答錯(cuò)誤 292 / 294 個(gè)通過的測(cè)試用例

輸入
nums =
[1000000000,1000000000,1000000000,1000000000]
target =
-294967296

添加到測(cè)試用例
輸出
[[1000000000,1000000000,1000000000,1000000000]]
預(yù)期結(jié)果
[]

為什么錯(cuò)誤了

是因?yàn)檫@里越界了,明顯是加入了一個(gè) int 越界的問題隔躲,感覺沒必要摩梧,影響解法整體的美感。

我們調(diào)整一下 sum 的類型宣旱,改為 long仅父。只改下面的一行

int sum = nums[i] + nums[j] + nums[left] + nums[right];

改為:

long sum = (long) nums[i] + nums[j] + nums[left] + nums[right];

效果

17ms 37.37%

小結(jié)

整體這個(gè)類型的題目到這里就告一段落了。

整體只是披著數(shù)組的形式浑吟,本質(zhì)上就是下面幾種:

1)暴力求解

2)排序+二分

3)排序+雙指針

4)Hash 改進(jìn)優(yōu)化

其中 3 的適用性還是比較強(qiáng)的笙纤。

參考資料

https://leetcode.cn/problems/4sum/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市组力,隨后出現(xiàn)的幾起案子省容,更是在濱河造成了極大的恐慌,老刑警劉巖燎字,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腥椒,死亡現(xiàn)場(chǎng)離奇詭異阿宅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寞酿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門家夺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伐弹,你說我怎么就攤上這事拉馋。” “怎么了惨好?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵煌茴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我日川,道長(zhǎng)蔓腐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任龄句,我火速辦了婚禮回论,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘分歇。我一直安慰自己傀蓉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布职抡。 她就那樣靜靜地躺著葬燎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缚甩。 梳的紋絲不亂的頭發(fā)上谱净,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音擅威,去河邊找鬼壕探。 笑死,一個(gè)胖子當(dāng)著我的面吹牛郊丛,可吹牛的內(nèi)容都是我干的浩蓉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宾袜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了驾窟?” 一聲冷哼從身側(cè)響起庆猫,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绅络,沒想到半個(gè)月后月培,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘁字,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年杉畜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纪蜒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡此叠,死狀恐怖纯续,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灭袁,我是刑警寧澤猬错,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站茸歧,受9級(jí)特大地震影響倦炒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜软瞎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一逢唤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涤浇,春花似錦鳖藕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纹烹,卻和暖如春页滚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铺呵。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工裹驰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人片挂。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓幻林,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親音念。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沪饺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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