LeetCode【1】. Two Sum--java的不同方法實現(xiàn)

  • 注:之前在其他平臺的文章與記錄慢慢也都放這邊吧赋访,權(quán)當(dāng)資料遷移與備份可都。如下:

LeetCode,最近才知道有這么好的平臺可以刷題蚓耽,真是慚愧慚愧∏現(xiàn)在開始,努力步悠,一道道地刷題签杈!剛開始,難免有不足的地方鼎兽。也有借用別人思路的部分答姥,學(xué)習(xí)才能進(jìn)步!之前想一道道地刷谚咬,但是能力問題鹦付,又要做其他事,很容易就停下了择卦,今天在豆瓣看到一個對題目進(jìn)行分類的敲长,挺不錯,補(bǔ)充mark一下:LeetCode 題目總結(jié)/分類

一秉继、題

第一道題Two Sum 如下:

  • Given an array of integers, 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.
    Input: numbers={2, 7, 11, 15}, target=9 Output: index1=1, index2=2

簡單來說祈噪,就是給一數(shù)組及一數(shù)值,求數(shù)組中兩元素相加為該數(shù)值對應(yīng)的兩個索引尚辑。且要求index1小于index2辑鲤,而且答案結(jié)果穩(wěn)定。

二杠茬、解:

2.1 遍歷:

最粗暴的方法月褥,時間復(fù)雜度為O(n^2)。一開始提交通不過澈蝙,太耗時了吓坚,后來又可以提交。略奇怪灯荧。


public class Solution {  
    public int[] twoSum(int[] nums, int target) {  
        int index1,index2;  
        int[] index=new int[]{0,1};  
        for(int i = 0; i< nums.length; i++)  
        {  
            for(int j = i+1; j< nums.length; j++)  
            {  
                if(target==(nums[i]+nums[j]))  
                {  
                    index[0] = i+1;  
                    index[1] = j+1;  
                    return index;  
                }  
            }  
        }  
        return index;  
    }  
  }  

2.2 HashSet

利用HashSet元素不能重復(fù)的原理礁击,新建一個HashSet,然后可先檢查target-nums[i]能否加入該HashSet逗载,若能哆窿,則說明前面的數(shù)據(jù)沒有與第i個符合的組合。在把該target-nums[i]刪除厉斟,重新添加nums[i](避免有兩個元素相等返回錯誤判斷)挚躯。當(dāng)添加不成功,則說明存在符合的組合擦秽,記錄此時的i码荔,并從i以前的數(shù)組尋找他的另一半漩勤。有點繁瑣,但時間復(fù)雜度為O(n)缩搅,空間復(fù)雜度為O(n)越败。


public class Solution {  
    public int[] twoSum(int[] nums, int target) {  
        int index1,index2;  
        int[] index=new int[]{0,1};  
        Set nset = new HashSet();  
          
        for(int i = 0; i< nums.length; i++)  
        {  
           if(nset.add(target-nums[i])) //檢查是否有nums[i]配對的元素存在,無則添加成功   
           {  
               nset.remove(target-nums[i]); //添加該元素只是為了判斷是否存在硼瓣,本來不應(yīng)該添加的這里又刪掉  
               nset.add(nums[i]);  
           }else  
           {  
               index[1] = i+1;  
               for(int j = 0; j< i; j++)  
               {  
                   if(target==(nums[i]+nums[j]))  
                   {  
                       index[0] = j+1;  
                       return index;  
                   }  
               }  
               return index;  
           }  
             
        }  
        return index;  
    } 
}  

有點奇怪究飞,以上提交后的結(jié)果為“Runtime: 332 ms”,但是我把用add()方法來判斷是否存在的方式替換成直接用contains()方法來判斷堂鲤,即把“ if(nset.add(target-nums[i])) ”換成“if(!nset.contains(target-nums[i])) ” 然后刪掉“nset.remove(target-nums[i]); ”亿傅,但是“Runtime: 364 ms”。試了幾次瘟栖,大小有變動葵擎,但是總是后者要耗時多點。但實際是少執(zhí)行一條命令半哟。這里有點疑惑坪蚁。不知是采用黑盒測試來檢驗算法的正確性。

另外镜沽,有人疑慮HashSet在添加元素的時候去判斷是否已存在元素不用去遍歷已有的集合嗎敏晤?這不是跟第一個方法的遍歷一樣嗎?其實不然缅茉,HashSet 的元素存放位置是根據(jù)每個元素的哈希碼來放的嘴脾,就是知道一個元素,算出其哈希碼蔬墩,就能知道他存放的地址译打。就像學(xué)校,每來一個新生就給他個學(xué)號拇颅,老師找你不用一間間宿舍去找你奏司,只要知道學(xué)號就能直接定位到你的宿舍。

2.3 HashMap

用HashMap來做樟插,道理相同韵洋,不過跟二還是有點區(qū)別。1黄锤、HashMap要需要為每個元素創(chuàng)建key和value兩個內(nèi)存空間搪缨,輔助空間翻倍。本例子就是用value來放index鸵熟;2副编、由于用value來放index,找到一個后流强,另外一個就馬上可以得到其index痹届。二跟三呻待,一個省點空間、一個省點點時間队腐,都差別不大带污。


public class Solution {    
    public int[] twoSum(int[] nums, int target) {    
        int[] index=new int[]{0,1};  
        HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();  
          
        for(int i = 0; i<nums.length; i++)  
        {  
            if(hm.containsKey(target - nums[i]))  
            {  
                index[1] = i+1;  
                index[0] = hm.get(target-nums[i])+1;     
                return index;     
            }else  
            {  
                 hm.put(nums[i],i);  
            }  
        }  
        return index;    
    }  
       
}    

參考:LeetCode – Two Sum (Java)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市香到,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌报破,老刑警劉巖悠就,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異充易,居然都是意外死亡梗脾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門盹靴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炸茧,“玉大人,你說我怎么就攤上這事稿静∷蠊冢” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵改备,是天一觀的道長控漠。 經(jīng)常有香客問我,道長悬钳,這世上最難降的妖魔是什么盐捷? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮默勾,結(jié)果婚禮上碉渡,老公的妹妹穿的比我還像新娘。我一直安慰自己母剥,他們只是感情好滞诺,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著环疼,像睡著了一般铭段。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秦爆,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天序愚,我揣著相機(jī)與錄音,去河邊找鬼等限。 笑死爸吮,一個胖子當(dāng)著我的面吹牛芬膝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播形娇,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼锰霜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了桐早?” 一聲冷哼從身側(cè)響起癣缅,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哄酝,沒想到半個月后友存,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡陶衅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年屡立,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搀军。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡膨俐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罩句,到底是詐尸還是另有隱情焚刺,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布门烂,位于F島的核電站檩坚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诅福。R本人自食惡果不足惜匾委,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓润。 院中可真熱鬧赂乐,春花似錦、人聲如沸咖气。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崩溪。三九已至浅役,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伶唯,已是汗流浹背觉既。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞪讼。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓钧椰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親符欠。 傳聞我的和親對象是個殘疾皇子嫡霞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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