數(shù)組求和

問題1

數(shù)組里求兩數(shù)之和等于目標數(shù)

原理

  • 這個問題可能是很多人接觸LeetCode的第一道算法題了
  • 解法很多種我還是喜歡使用map的方式來解決,map的key記錄的是數(shù)據(jù)的元素,value記錄的是數(shù)組元素對應的坐標
  • 關(guān)鍵步驟在于 map.get(target-nums[i])!=null 說明找到元素

代碼

class Solution {
    public int[] twoSum(int[] nums, int target) {
        if(nums==null||nums.length<=0){
            return null;
        }
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if (map.get(target-nums[i])!=null){
                return new int[]{map.get(target-nums[i]),i};
            }else{
                map.put(nums[i],i);
            }
        }
        return null;
    }
}

注意事項

  • 暫無

問題2

數(shù)組里求三數(shù)之和等于目標數(shù)

原理

  • 三數(shù)之和伴郁,簡單理解就是兩數(shù)之和的進階版唧瘾,但是昨晚就完全不一樣了失息。
  • 第一步髓涯,對數(shù)組進行排序 arrays.sort
  • 第二步杂数,使用遍歷+二分查找的方式奋单,搜索符合目標的元素锉试。
  • 注意兩種特殊情況處理

代碼

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        if (nums == null || nums.length <= 0) {
            return list;
        }
        Arrays.sort(nums);

        for (int i = 0; i < nums.length-2; i++) {
            if (i - 1 >=0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int low = i + 1;
            int high = nums.length - 1;
            while (low < high) {
                int c = nums[i] + nums[low] + nums[high];
                if (c == 0) {
                    List<Integer> tlist = new ArrayList<>();
                    tlist.add(nums[i]);
                    tlist.add(nums[low]);
                    tlist.add(nums[high]);
                    list.add(new ArrayList<>(tlist));
                    while (low < high && nums[low] == nums[low + 1]) {
                        low++;
                    }
                    while (low < high && nums[high] == nums[high - 1]) {
                        high--;
                    }
                    low++;
                    high--;
                } else if (c < 0) {
                    low++;
                } else {
                    high--;
                }
            }

        }
        return list;
    }
}

注意事項

  • 特別注意當i>=0 && nums[i] == nums[i - 1]這種重復的情況
  • 注意排除掉第二種重復的情況 while (low < high && nums[low] == nums[low + 1]) 和
    while (low < high && nums[high] == nums[high - 1])

問題3

數(shù)組里求四數(shù)之和等于目標數(shù)

原理

  • 原理和三數(shù)之和類似,只是多了一層循環(huán)而已览濒,還是使用循環(huán)加雙指針
  • 需要特別注意邊界問題

代碼

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list = new ArrayList<>();
        if (nums==null||nums.length<=0){
            return list;
        }

        Arrays.sort(nums);

        for(int i=0;i<nums.length;i++){
            if (i>0&&nums[i]==nums[i-1]){
                continue;
            }
            for(int j=i+1;j<nums.length;j++){
                if (j>i+1&&nums[j]==nums[j-1]){
                    continue;
                }
                int low = j+1;
                int high = nums.length-1;

                while (low<high){
                    int c = nums[i]+nums[j]+nums[low]+nums[high];
                    if (c==target){
                        List<Integer> tlist = new ArrayList<>();
                        tlist.add(nums[i]);
                        tlist.add(nums[j]);
                        tlist.add(nums[low]);
                        tlist.add(nums[high]);
                        list.add(new ArrayList<>(tlist));
                        while (low<high&&nums[low]==nums[low+1]){
                            low++;
                        }
                        while (low<high&&nums[high]==nums[high-1]){
                            high--;
                        }
                        low++;
                        high--;
                    }else if(c<0){
                        low++;
                    }else{
                        high--;
                    }
                }
            }
        }
        return list;
    }
}

注意事項

  • 注意第一層循環(huán)的邊界問題i>0時 nums[i]==nums[i-1]
  • 注意第二層循環(huán)的邊界問題j>i+1時 nums[j]==nums[j+1]

問題4

給定一個包括 n 個整數(shù)的數(shù)組 nums 和 一個目標值 target呆盖。找出 nums 中的三個整數(shù),使得它們的和與 target 最接近贷笛。返回這三個數(shù)的和应又。假定每組輸入只存在唯一答案。

原理

  • 從三數(shù)之和到四數(shù)之和再到現(xiàn)在最近的三數(shù)之和乏苦,其實原理都一樣株扛,排序+雙指針
  • 需要注意的是最近的三數(shù)之和尤筐,就需要有一個臨時遍歷記錄最接近的值
  • 雙指針什么時候移動呢?當前的三數(shù)之和和目標數(shù)比較洞就,小的時候low++,大的時候high--

代碼

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        if(nums==null||nums.length<=0){
            return -1;
        }
        Arrays.sort(nums);

        int c = Integer.MAX_VALUE;

        for(int i=0;i<nums.length;i++){
            int low = i+1;
            int high = nums.length-1;

            while(low<high){
                int t = nums[low]+nums[high]+nums[i];
                if(target==t){
                    return t;
                }
                if(Math.abs(t-target)-Math.abs(c-target)<0){
                    c = t;
                }
                if(t<target){
                    low++;
                }else{
                    high--;
                }
            }
        }
        return c;
    }
}

注意事項

  • 需要注意的什么時候移動low和high
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盆繁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旬蟋,更是在濱河造成了極大的恐慌油昂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倾贰,死亡現(xiàn)場離奇詭異冕碟,居然都是意外死亡,警方通過查閱死者的電腦和手機躁染,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門鸣哀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吞彤,你說我怎么就攤上這事我衬。” “怎么了饰恕?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵挠羔,是天一觀的道長。 經(jīng)常有香客問我埋嵌,道長破加,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任雹嗦,我火速辦了婚禮范舀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘了罪。我一直安慰自己锭环,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布泊藕。 她就那樣靜靜地躺著辅辩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娃圆。 梳的紋絲不亂的頭發(fā)上玫锋,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音讼呢,去河邊找鬼撩鹿。 笑死,一個胖子當著我的面吹牛吝岭,可吹牛的內(nèi)容都是我干的三痰。 我是一名探鬼主播吧寺,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼窜管,長吁一口氣:“原來是場噩夢啊……” “哼散劫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幕帆,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤获搏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后失乾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體常熙,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年碱茁,在試婚紗的時候發(fā)現(xiàn)自己被綠了裸卫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡纽竣,死狀恐怖墓贿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜓氨,我是刑警寧澤聋袋,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站穴吹,受9級特大地震影響幽勒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜港令,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一啥容、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顷霹,春花似錦咪惠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绅喉,卻和暖如春渠鸽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柴罐。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工徽缚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人革屠。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓凿试,卻偏偏與公主長得像排宰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子那婉,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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