18.四數(shù)之和

18.四數(shù)之和

題目鏈接:https://leetcode-cn.com/problems/4sum/

難度:中等

給定一個(gè)包含 n 個(gè)整數(shù)的數(shù)組 nums 和一個(gè)目標(biāo)值 target爬骤,判斷 nums 中是否存在四個(gè)元素 a履怯,b氮帐,cd 导俘,使得 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]
]

解法一:雙指針法 + 排序

解法思路:

若是做過15. 三數(shù)之和會(huì)發(fā)現(xiàn)這兩個(gè)題是一個(gè)解題思路。

我們利用一個(gè)雙重循環(huán)a和b來控制四個(gè)數(shù)中最小的兩數(shù)鱼蝉,再用雙指針l和r來控制另外兩數(shù)洒嗤。

計(jì)算:sum = nums[a]+nums[b]+nums[l]+nums[r];

若sum == target,則把這四個(gè)數(shù)添加到結(jié)果數(shù)組中

若sum > target魁亦,則說明r太大了渔隶,將r--,將指針r向左移動(dòng)洁奈。

若sum < target间唉,則說明l太大了,將l++利术,將指針l向右移動(dòng)呈野。

解決重復(fù)結(jié)果問題:

我們在四層變量值改變的時(shí)候,可以判斷一下印叁,是否和上一次的值相等被冒,若相等,直接跳過這次循環(huán)轮蜕。

時(shí)間復(fù)雜度優(yōu)化:

我們在外兩層a和b變量值改變的時(shí)候昨悼,可以計(jì)算一下,他們的最大值和最小值肠虽,若最大值比target還小幔戏,或者最小值比target還大,都可以直接跳過税课。

image.png

代碼:

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> results = new ArrayList<List<Integer>>();
        int l,r;
        int sum;
        int max,min;
        Arrays.sort(nums);
        int len = nums.length;
        
        for(int a = 0;a<len-3;a++) {
            //當(dāng)nums[a] == nums[a-1] 直接跳過
            if(a>0 && nums[a] == nums[a-1]) {
                continue;
            }
            
            //獲取當(dāng)前的最大值闲延,如果最大值比目標(biāo)值還小,直接跳過
            max = nums[a]+nums[len-3]+nums[len-2]+nums[len-1];
            if(max<target) {
                continue;
            }
            
            //獲取當(dāng)前的最小值韩玩,如果最小值比目標(biāo)值還大垒玲,直接跳過
            min = nums[a]+nums[a+1]+nums[a+2]+nums[a+3];
            if(min>target) {
                continue;
            }
            
            for(int b = a+1;b<len-2;b++) {
                //當(dāng)nums[b] == nums[b-1]直接跳過
                if(b>a+1 && nums[b] == nums[b-1]) {
                    continue;
                }
                l = b+1;
                r = len-1;
                
                //獲取當(dāng)前的最大值,如果最大值比目標(biāo)值還小找颓,直接跳過
                max = nums[a]+nums[b]+nums[r-1]+nums[r];
                if(max<target) {
                    continue;
                }
                
                //獲取當(dāng)前的最小值合愈,如果最小值比目標(biāo)值還大,直接跳過
                min = nums[a]+nums[b]+nums[l]+nums[l+1];
                if(min>target) {
                    continue;
                }
                
                while(l<r) {
                    sum = nums[a]+nums[b]+nums[l]+nums[r];
                    if(sum == target) {
                        results.add(Arrays.asList(nums[a],nums[b],nums[l],nums[r]));
                        l++;
                        r--;
                        
                        //當(dāng)nums[r]==nums[r+1]直接跳過
                        while(r<len-1 && r>l && nums[r]==nums[r+1]) {
                            r--;
                        }
                        //當(dāng)nums[l]==nums[l-1]直接跳過
                        while(l>b+1 && r>l && nums[l]==nums[l-1]) {
                            l++;
                        }
                    }else if(sum > target) {
                        r--;
                    }else {
                        l++;
                    }
                }
            }
        }
        return results;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末击狮,一起剝皮案震驚了整個(gè)濱河市佛析,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彪蓬,老刑警劉巖寸莫,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異档冬,居然都是意外死亡膘茎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門酷誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來披坏,“玉大人,你說我怎么就攤上這事盐数“舴鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵玫氢,是天一觀的道長着茸。 經(jīng)常有香客問我,道長琐旁,這世上最難降的妖魔是什么涮阔? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮灰殴,結(jié)果婚禮上敬特,老公的妹妹穿的比我還像新娘。我一直安慰自己牺陶,他們只是感情好伟阔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掰伸,像睡著了一般皱炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狮鸭,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天合搅,我揣著相機(jī)與錄音多搀,去河邊找鬼。 笑死灾部,一個(gè)胖子當(dāng)著我的面吹牛康铭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赌髓,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼从藤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锁蠕?” 一聲冷哼從身側(cè)響起夷野,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荣倾,沒想到半個(gè)月后悯搔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃呼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年鳖孤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抡笼。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苏揣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出推姻,到底是詐尸還是另有隱情平匈,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布藏古,位于F島的核電站增炭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拧晕。R本人自食惡果不足惜隙姿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厂捞。 院中可真熱鬧输玷,春花似錦、人聲如沸靡馁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭墨。三九已至赔嚎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尤误。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工侠畔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袄膏。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓践图,卻偏偏與公主長得像掺冠,于是被迫代替她去往敵國和親沉馆。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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