LeetCode中的“N Sum”問題(一)

Leetcode中有很多“N Sum”問題缚陷,這種問題就是給出一個數(shù)組A袒餐,一個目標數(shù)T,然后計算得出在A中有多少數(shù)種的組合嗡呼,使得其和剛好是T.
問題如下:
2 Sum: https://leetcode.com/problems/two-sum/
2 Sum Input array is sorted: https://leetcode.com/problems/two-sum-ii-input-array-is-sorted
3 Sum: https://leetcode.com/problems/3sum
3 sum-closest: https://leetcode.com/problems/3sum-closest/
4 Sum: https://leetcode.com/problems/4sum/
4 SumII: https://leetcode.com/problems/4sum-ii/

首先從最簡單的2 Sum Input array is sorted: 問題來看

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution and you may not use the same element twice.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

由于數(shù)組是已經(jīng)排序的华嘹,那么我們可以知道數(shù)組中最小的數(shù)是nums[0],最大的是nums[nums.size() - 1]场仲。設置兩個index,一個叫front仁热,初始值為0榜揖,另外一個叫back,初始值為nums.size() - 1抗蠢。求nums[front] + nums[back]举哟,如果和大于target,那么就將back減一迅矛,如果小于妨猩,就將front 加1。
將上述思路整理成代碼秽褒。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        int front = 0;
        int back = nums.size() - 1;
        while(front < back) {
            int t = nums[front] + nums[back] ;
            if(t == target) {
                res.push_back(front + 1);
                res.push_back(back + 1);
                return res;
            }
            else if(t > target) 
                back --;            
            else 
                front ++;
        }
        return res;
    }
};

上述解法復雜度為O(N)壶硅,算是比較理想的解法了。有了這個基礎销斟,我們看下面的題庐椒。
3 Sum

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:

[
  [-1, 0, 1],
  [-1, -1, 2]
]

由于我們已經(jīng)做了 2 Sum問題,那么這個題可以轉(zhuǎn)化(下降)為2 Sum問題蚂踊。然后采用上面的算法來做约谈。代碼如下:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());//排序
        unsigned int i;
        for (i = 0; i < nums.size(); ++i) {
            int target = -nums[i];//這里轉(zhuǎn)化為了2 Sum問題
            int front = i + 1;
            int back = nums.size() - 1;
            while(front < back) {
                int sum = nums[front] + nums[back];
                if(sum < target) 
                    front++;
                else if(sum > target) 
                    back--;
                else {
                    vector<int> triple(3,0);
                    triple[0] = nums[i];
                    triple[1] = nums[front];
                    triple[2] = nums[back];
                    res.push_back(triple);
                    //跳過相同的數(shù)字
                while(front < back && nums[front]== triple[1])
                    front ++;
                while(front < back && nums[back] == triple[2])
                    back--;
                }
                }
                while(i + 1 < nums.size() && nums[i] == nums[i + 1]) 
                    i++;
            }
        return res;
    }
};

下面的4 Sum問題也可以變?yōu)? Sum然后變?yōu)? Sum來解決。
https://leetcode.com/problems/4sum/#/description

剩下的幾個題比較特殊犁钟,因為不能用排序打亂順序棱诱,這就需要用到hash表來存儲。我留到下次再總結吧特纤。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末军俊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捧存,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昔穴,死亡現(xiàn)場離奇詭異镰官,居然都是意外死亡,警方通過查閱死者的電腦和手機吗货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門泳唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宙搬,你說我怎么就攤上這事笨腥。” “怎么了勇垛?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵脖母,是天一觀的道長。 經(jīng)常有香客問我闲孤,道長谆级,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任讼积,我火速辦了婚禮肥照,結果婚禮上,老公的妹妹穿的比我還像新娘勤众。我一直安慰自己舆绎,他們只是感情好,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布们颜。 她就那樣靜靜地躺著亿蒸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掌桩。 梳的紋絲不亂的頭發(fā)上边锁,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音波岛,去河邊找鬼茅坛。 笑死,一個胖子當著我的面吹牛则拷,可吹牛的內(nèi)容都是我干的贡蓖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼煌茬,長吁一口氣:“原來是場噩夢啊……” “哼斥铺!你這毒婦竟也來了?” 一聲冷哼從身側響起坛善,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤晾蜘,失蹤者是張志新(化名)和其女友劉穎邻眷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剔交,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡肆饶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岖常。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驯镊。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竭鞍,靈堂內(nèi)的尸體忽然破棺而出板惑,到底是詐尸還是另有隱情,我是刑警寧澤偎快,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布冯乘,位于F島的核電站,受9級特大地震影響滨砍,放射性物質(zhì)發(fā)生泄漏往湿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一惋戏、第九天 我趴在偏房一處隱蔽的房頂上張望领追。 院中可真熱鬧,春花似錦响逢、人聲如沸绒窑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽些膨。三九已至,卻和暖如春钦铺,著一層夾襖步出監(jiān)牢的瞬間订雾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工矛洞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洼哎,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓沼本,卻偏偏與公主長得像噩峦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抽兆,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗识补。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評論 2 45
  • 有天江嵐帶孩子來玩辫红,聊到帶孩子凭涂,我說祝辣,我覺得時間過得好快,一下子他都四個多月了导盅。江嵐立即說较幌,那你肯定帶的很開心揍瑟,不...
    souljourney閱讀 573評論 1 1
  • 日子如行云流水 從來不會告訴你 誰會從你身邊離去 往昔似手中畫筆 胡亂勾畫出輪廓 天黑之前把它遺忘
    張驀驀閱讀 138評論 0 0
  • 真正讓我愛著的音樂白翻,不是那些讓我燥起來的音樂,不是那些喧囂著甩頭發(fā)的音樂绢片。真正愛著的音樂滤馍,當我聽到她,我臉上會露出...
    麥小蒙閱讀 270評論 0 0