某公司的筆試編程題

原題:

給定一個數(shù)組candidate和一個目標值target,求出candidate中兩個數(shù)的和等于target的組合悟衩。比如輸入數(shù)組[1,2,3,4,7]和目標值10.輸出[ 3, 7]如果找不到輸出[ -1,-1 ]娘赴。要求時間復雜度盡量是O(n)。

思路:

求兩個數(shù)字之和郑藏,假設給定的和為target。一個變通的思路,就是對數(shù)組中的每個數(shù)字arr[i]都判別target-arr[i]是否在數(shù)組中贿堰,這樣跑杭,就變通成為一個查找的算法铆帽。
在一個無序數(shù)組中查找一個數(shù)的復雜度是O(N),對于每個數(shù)字arr[i]德谅,都需要查找對應的target-arr[i]在不在數(shù)組中爹橱,很容易得到時間復雜度還是O(N^2)。這和最原始的方法相比沒有改進窄做。但是如果能夠提高查找的效率愧驱,就能夠提高整個算法的效率。怎樣提高查找的效率呢椭盏?
學過編程的人都知道组砚,提高查找效率通常可以先將要查找的數(shù)組排序掏颊,然后用二分查找等方法進行查找糟红,就可以將原來O(N)的查找時間縮短到O(log2N)艾帐,這樣對于每個arr[i],都要花O(log2N)去查找對應的target-arr[i]在不在數(shù)組中盆偿,總的時間復雜度降低為N* log2N柒爸。當讓將長度為N的數(shù)組進行排序本身也需要O(Nlog2N)的時間,好在只須要排序一次就夠了事扭,所以總的時間復雜度依然O(Nlog2N)捎稚。這樣,就改進了最原始的方法求橄。
到這里今野,有的讀者可能會更進一步地想,先排序再二分查找固然可以將時間從O(N^2)縮短到O(N*log2N)罐农,但是還有更快的查找方法:hash表条霜。因為給定一個數(shù)字,根據(jù)hash表映射查找另一個數(shù)字是否在數(shù)組中啃匿,只需要O(1)時間蛔外。這樣的話,總體的算法復雜度可以降低到O(N)溯乒,但這種方法需要額外增加O(N)的hash表存儲空間夹厌。某些情況下,用空間換時間也不失為一個好方法裆悄。

算法如下:

   public static String findSumtwo(int [] candidates, int target){

     if(candidates==null||candidates.length<2){  
        return null;  
    }  
    HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();

     for(int i=0;i<candidates.length;i++){

        map.put(i,array[i]);

    }

    int [] failOut=new int[]{-1,-1};

     for(int j=0;j<candidates.length;j++){

        if(map.containsValue(target-candidates[j])&& map.get(target-candidates[j])!=j){

             int [] t=new int[2];
             t[0]=array[j];
             t[1]=target-candidates[j];
             return Arrays.toString(t);
        }
    }
    return Arrays.toString(failOut);
}

那么問題來了矛纹,如果輸出所有組合,不限于兩個數(shù)的組合呢光稼?

For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8或南。

A solution set is:

[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]

思路一樣,代碼如下:

   public class Solution {

 public  List<List<Integer>>combinationSum2(int[] candidates, int target)   {

     List<List<Integer>> mList = null;
     if(candidates == null || candidates.length < 1)
        return mList;
    Arrays.sort(candidates);
    List<Integer> list = new ArrayList<Integer>();
    Set<List<Integer>> set = new HashSet<List<Integer>>();  // List和set,其實是一樣的艾君,因為之前對數(shù)組排過序了
    combinationCore(candidates, 0, target, list , set );
        mList = new ArrayList<>(set);
        return mList ;
}
    public void combinationCore(int[] candidates, int index, int target, List<Integer> list, Set<List<Integer>> set){
      for(int i = index; i < candidates.length; i++){
         if(target == candidates[i]){
            List<Integer> res = new ArrayList<Integer>();
            res.addAll(list);
            res.add(candidates[i]);
            set.add(res);
         }
         else if(target > candidates[i]){
             List<Integer> res = new ArrayList<Integer>();
             res.addAll(list);
             res.add(candidates[i]);
             combinationCore(candidates, i + 1, target - candidates[i], res, set);  // 注意這里是i + 1
      }
         else
            break;
    }
   }
 }

博客園:http://www.cnblogs.com/leavescy/p/5901338.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末采够,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冰垄,更是在濱河造成了極大的恐慌蹬癌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虹茶,死亡現(xiàn)場離奇詭異逝薪,居然都是意外死亡,警方通過查閱死者的電腦和手機蝴罪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門董济,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人要门,你說我怎么就攤上這事虏肾±。” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵询微,是天一觀的道長崖瞭。 經(jīng)常有香客問我,道長撑毛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任唧领,我火速辦了婚禮藻雌,結果婚禮上,老公的妹妹穿的比我還像新娘斩个。我一直安慰自己胯杭,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布受啥。 她就那樣靜靜地躺著做个,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滚局。 梳的紋絲不亂的頭發(fā)上居暖,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音藤肢,去河邊找鬼太闺。 笑死,一個胖子當著我的面吹牛嘁圈,可吹牛的內容都是我干的省骂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼最住,長吁一口氣:“原來是場噩夢啊……” “哼钞澳!你這毒婦竟也來了?” 一聲冷哼從身側響起涨缚,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轧粟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仗岖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逃延,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年轧拄,在試婚紗的時候發(fā)現(xiàn)自己被綠了揽祥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡檩电,死狀恐怖拄丰,靈堂內的尸體忽然破棺而出府树,到底是詐尸還是另有隱情,我是刑警寧澤料按,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布奄侠,位于F島的核電站,受9級特大地震影響载矿,放射性物質發(fā)生泄漏垄潮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一闷盔、第九天 我趴在偏房一處隱蔽的房頂上張望弯洗。 院中可真熱鬧,春花似錦逢勾、人聲如沸牡整。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逃贝。三九已至,卻和暖如春迫摔,著一層夾襖步出監(jiān)牢的瞬間沐扳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工攒菠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迫皱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓辖众,卻偏偏與公主長得像卓起,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凹炸,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗戏阅。 張土汪:刷leetcod...
    土汪閱讀 12,745評論 0 33
  • 你以為你是對的 他是錯的
    陳蹦迪閱讀 193評論 0 1
  • 我是一個初中生,我很喜歡玩游戲啤它,有時候奕筐,我覺得,游戲就是我未來的夢想变骡,就是我的一切离赫。 游戲嘛,總是被人看成不務正業(yè)...
    末無閱讀 252評論 0 2
  • 對于高二學生來說,文理科的選擇至關重要台妆,不僅要根據(jù)興趣來選擇翎猛,更要根據(jù)未來工作方向選擇胖翰。 有些人選擇文科是因為感興...
    Abandonede閱讀 282評論 0 4
  • 初高中的時候,總是會有這樣的情景切厘,一群男生或者一群女生簇擁在陽臺上萨咳,嘰嘰喳喳地看著某個知情或不知情的人從樓下走過。...
    召小南閱讀 282評論 0 0