LeetCode - 兩數(shù)之和(Swift)

兩數(shù)之和

給定一個整數(shù)數(shù)組 nums 和一個目標(biāo)值 target,請你在該數(shù)組中找出和為目標(biāo)值的那兩個整數(shù),并返回他們的數(shù)組下標(biāo)。

你可以假設(shè)每種輸入只會對應(yīng)一個答案霉翔。但是,數(shù)組中同一個元素不能使用兩遍苞笨。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因?yàn)?nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

思路

1债朵、暴力法

暴力法很簡單子眶,雙重for循環(huán),遍歷每個元素 x序芦,并查找是否存在一個值與 target - x 相等的目標(biāo)元素

class Solution {
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] { // 544ms 13.9MB
        for (index, value) in nums.enumerated() {
            for remainderIndex in index ..< nums.count {
                if ((value + nums[remainderIndex]) == target) && (index != remainderIndex) {
                    return [index, remainderIndex]
                }
            }
        }
        return []
    }
}

時間復(fù)雜度為 O(n^2)臭杰,空間復(fù)雜度:O(1)。

2谚中、兩遍字典即哈希表

哈希表渴杆,通過以空間換取速度的方式,我們可以將查找時間從 O(n) 降低到 O(1)藏杖。

一個簡單的實(shí)現(xiàn)使用了兩次迭代。在第一次迭代中脉顿,我們將每個元素的值和它的索引添加到表中蝌麸。然后,在第二次迭代中艾疟,我們將檢查每個元素所對應(yīng)的目標(biāo)元素(target - nums[i])是否存在于表中来吩。注意,該目標(biāo)元素不能是 nums[i]本身蔽莱!

func twoSum(_ nums: [Int], _ target: Int) -> [Int] { // 56ms 14.1MB
    var dict: [Int: Int] = [:]

    for (index, value) in nums.enumerated() {
        dict[value] = index
    }

    for (index, value) in nums.enumerated() {
        if let remainderIndex = dict[target - value] {
            if remainderIndex != index {
                return [index, remainderIndex]
            }
        }
    }
    return []
}

由于哈希表將查找時間縮短到 O(1) 弟疆,所以時間復(fù)雜度為 O(n),空間復(fù)雜度:O(n)

3盗冷、一遍哈希表

在進(jìn)行迭代并將元素插入到表中的同時怠苔,可以檢查表中是否已經(jīng)存在當(dāng)前元素所對應(yīng)的目標(biāo)元素。如果它存在仪糖,那找到了對應(yīng)解柑司,并立即將其返回。

以數(shù)組元素值作為key锅劝,存儲對應(yīng)的位置index

  func twoSum(_ nums: [Int], _ target: Int) -> [Int] {  // 48 ms 14 MB
        guard nums.count > 1 else { return [] }
        var indexDic: [Int: Int] = [:]
        for (index, value) in nums.enumerated() { // 遍歷
            if let resetIndex = indexDic[target - value] { // 獲取對應(yīng)元素的位置
                return [index, resetIndex]
            }
            indexDic[value] = index
        }
        return []
    }

dic.keys來判斷是否包含值

  func twoSum(_ nums: [Int], _ target: Int) -> [Int] { // 48ms 14MB
        var dic: [Int: Int] = [:]
        for (index, num) in nums.enumerated() {
            let remainder = target - num
            if (dic.keys.contains(remainder)) { // 看keys算法包含
                if let resetIndex = dic[remainder], resetIndex != index {
                    return [resetIndex, index]
                }
            }
            dic[num] = index
        }
        return []
    }

只遍歷了包含有 n 個元素的列表一次攒驰,在表中進(jìn)行的每次查找只花費(fèi) O(1) 的時間,空間復(fù)雜度:O(n)

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末故爵,一起剝皮案震驚了整個濱河市玻粪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诬垂,老刑警劉巖劲室,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異结窘,居然都是意外死亡痹籍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門晦鞋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹲缠,“玉大人棺克,你說我怎么就攤上這事∠叨ǎ” “怎么了娜谊?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斤讥。 經(jīng)常有香客問我纱皆,道長,這世上最難降的妖魔是什么芭商? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任派草,我火速辦了婚禮,結(jié)果婚禮上铛楣,老公的妹妹穿的比我還像新娘近迁。我一直安慰自己,他們只是感情好簸州,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布鉴竭。 她就那樣靜靜地躺著,像睡著了一般岸浑。 火紅的嫁衣襯著肌膚如雪搏存。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天矢洲,我揣著相機(jī)與錄音璧眠,去河邊找鬼。 笑死读虏,一個胖子當(dāng)著我的面吹牛蛆橡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掘譬,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼泰演,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葱轩?” 一聲冷哼從身側(cè)響起睦焕,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎靴拱,沒想到半個月后垃喊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袜炕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年本谜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偎窘。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡乌助,死狀恐怖溜在,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情他托,我是刑警寧澤掖肋,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站赏参,受9級特大地震影響志笼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜把篓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一纫溃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧韧掩,春花似錦紊浩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽万伤。三九已至窒悔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間敌买,已是汗流浹背简珠。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虹钮,地道東北人聋庵。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像芙粱,于是被迫代替她去往敵國和親祭玉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361