代碼隨想錄打卡Day6

Leetcode 454

題目鏈接:四數(shù)相加 II
題目分了四個數(shù)組,每個里面取一個數(shù)卦羡,不需要考慮去重的問題噪馏,相對簡單,將四個數(shù)組兩兩分組:

  1. 把前兩個數(shù)組求和的每一種可能都加入HashMap中(key是和绿饵,value是出現(xiàn)的個數(shù))
  2. 對后兩個數(shù)組每一次求和后欠肾,檢查HashMap中是否存在和為0的數(shù),若有則結(jié)果加上該數(shù)次數(shù)
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int n = nums1.length;
        int result=0;
        HashMap<Integer,Integer> hashmap = new HashMap<>();
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                hashmap.put(-nums1[i]-nums2[j], hashmap.getOrDefault(-nums1[i]-nums2[j], 0)+1);
            }
        }
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                if(hashmap.containsKey(nums3[i] + nums4[j])){
                    result += hashmap.getOrDefault(nums3[i] + nums4[j], 0);
                }
            }
        }

        return result;
    }

LeetCode 15

題目鏈接:三數(shù)之和
一個數(shù)組里面找出所有不重復(fù)的三個元素拟赊,滿足和為target
采用雙指針法:

  1. 首先對數(shù)組進(jìn)行排序
  2. 第一個for循環(huán)固定遍歷第一個元素
  3. 第二個循環(huán)移動兩個指針的位置刺桃,移動邏輯為
if(nums[right]+nums[left]==target){
//找到的答案                  
}
//需要縮小和,只能移動right
if(nums[right]+nums[left]>target){
    right--;
}
//需要增大和吸祟,只能移動left
if(nums[right]+nums[left]<target){
    left++;
}
  1. 考慮去重復(fù):最外層的一次遍歷結(jié)束后瑟慈,如果下一個要遍歷的元素值相等,則跳過這一層遍歷屋匕,因為上一次遍歷已經(jīng)把這個元素值為第一個值的所有情況全部遍歷了葛碧;同理其他的也是
    整體代碼如下
public List<List<Integer>> threeSum(int[] nums) {
        //一切的基礎(chǔ),雙指針法要求必須排序
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        for(int i=0;i<nums.length-2;i++){

            //對于第一個元素的去重
            if(i>0&&nums[i-1]==nums[i]) continue;
            int target = -nums[i];
            
            int left = i+1;
            int right = nums.length-1;
            while(left<right){
                if(nums[right]+nums[left]==target){
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    left++;
                    right--;
                    //left去重
                    while(left<right&&nums[left]==nums[left-1]){
                        left++;
                    }
                    //right去重
                    while(left<right&&nums[right]==nums[right+1]){
                        right--;
                    }
                }
                //雙指針移動的規(guī)則體現(xiàn)
                if(nums[right]+nums[left]>target){
                    right--;
                }
                if(nums[right]+nums[left]<target){
                    left++;
                }
            }
            
        }
        return result;
    }

LeetCode 18

題目鏈接:四數(shù)之和
升級版三數(shù)之和过吻,還是使用雙指針进泼,循環(huán)再加一層

    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        for(int i=0; i<nums.length-3;i++){
            if(i>0&&nums[i]==nums[i-1])
                continue;
            for(int j=nums.length-1;j>=i+3;j--){
                if(j<nums.length-1&&nums[j]==nums[j+1])
                    continue;
                int left = i+1;
                int right = j-1;
                while(left<right){
                    if((long)nums[i]+nums[j]+nums[left]+nums[right]==target){
                        List<Integer> list = new ArrayList<>();
                        Collections.addAll(list, nums[i],nums[j],nums[left],nums[right]);
                        result.add(list);
                        left++;
                        right--;
                        while(nums[left]==nums[left-1]&&left<right){
                            left++;
                        }
                        while(nums[right]==nums[right+1]&&left<right){
                            right--;
                        }
                    }
                    if((long)nums[i]+nums[j]+nums[left]+nums[right]>target){
                        right--;
                    }
                    if((long)nums[i]+nums[j]+nums[left]+nums[right]<target){
                        left++;
                    }

                }
            }
        }
        return result;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乳绕,更是在濱河造成了極大的恐慌绞惦,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洋措,死亡現(xiàn)場離奇詭異翩隧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)呻纹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門堆生,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雷酪,你說我怎么就攤上這事淑仆。” “怎么了哥力?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵蔗怠,是天一觀的道長。 經(jīng)常有香客問我吩跋,道長寞射,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任锌钮,我火速辦了婚禮桥温,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梁丘。我一直安慰自己侵浸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布氛谜。 她就那樣靜靜地躺著掏觉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪值漫。 梳的紋絲不亂的頭發(fā)上澳腹,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音杨何,去河邊找鬼酱塔。 笑死,一個胖子當(dāng)著我的面吹牛晚吞,可吹牛的內(nèi)容都是我干的延旧。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼槽地,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捌蚊,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤集畅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缅糟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挺智,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年窗宦,在試婚紗的時候發(fā)現(xiàn)自己被綠了赦颇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡赴涵,死狀恐怖媒怯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情髓窜,我是刑警寧澤扇苞,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站寄纵,受9級特大地震影響鳖敷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜程拭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一定踱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恃鞋,春花似錦屋吨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至资锰,卻和暖如春敢课,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绷杜。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工直秆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞭盟。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓圾结,卻偏偏與公主長得像,于是被迫代替她去往敵國和親齿诉。 傳聞我的和親對象是個殘疾皇子筝野,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

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