兩數(shù)之和

給定一個(gè)整數(shù)數(shù)組和一個(gè)目標(biāo)值,找出數(shù)組中和為目標(biāo)值的兩個(gè)數(shù)炼列。

你可以假設(shè)每個(gè)輸入只對(duì)應(yīng)一種答案只搁,且同樣的元素不能被重復(fù)利用。


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

因?yàn)?nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

返回的是他們的索引值俭尖。

解決方案

這里的假設(shè)是成立的氢惋,所以不用考慮數(shù)據(jù)是否會(huì)重復(fù)這些雜七雜八的。

暴力法

遍歷每個(gè)元素x稽犁,并查找是否存在一個(gè)值與 target - x 相等的目標(biāo)元素焰望。

Python 實(shí)現(xiàn)方式


def twoSum(self, nums, target):
       """
       :type nums: List[int]
       :type target: int
       :rtype: List[int]
       """
       nums_len = len(nums)
        for i in range(nums_len):
            for j in range(i+1, nums_len):
                if nums[i] + nums[j] == target:
                    # l = []
                    # l.append(i)
                    # l.append(j)
                    return [i, j]

執(zhí)行時(shí)間

JavaScript 實(shí)現(xiàn)方式


/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    len = nums.length;
    for(let i = 0; i < len; i++) {

        for(let j = i + 1; j < len; j++){
            if (nums[i] + nums[j] === target) {
                return [i, j];
            }
        }
    }
    return l;
};

// let nums = [2, 7, 11, 15, 3, 6, 4, 5];

// let result = twoSum(nums, 9)

// console.log(result)

以上實(shí)現(xiàn)過程通過對(duì)每一個(gè)元素,進(jìn)行剩余元素進(jìn)行依依匹配已亥,直到匹配成功的兩層循環(huán)遍歷得已解決熊赖。其時(shí)間復(fù)雜度就是 O(n^2) 不考慮其低階和常數(shù)項(xiàng)的影響。其時(shí)間復(fù)雜度就不是很可觀了虑椎。

執(zhí)行時(shí)間

利用哈希表

通過哈希將原數(shù)組元素和索引對(duì)應(yīng)關(guān)聯(lián)起來從而達(dá)到找到目標(biāo)元素快速找出他的索引震鹉,并且哈希表支持以近似恒定的時(shí)間進(jìn)行快速查找,可以將查找時(shí)間從 O(n) 降低到 O(1)捆姜。

Python

Python 中的字典數(shù)據(jù)類型就是 Hash 表實(shí)現(xiàn)的传趾。

    def twoSum(self, nums, target):
          """
          :type nums: List[int]
          :type target: int
          :rtype: List[int]
          """
          # 創(chuàng)建字典,列表值為key泥技,索引為 value
          nums_dict = { nums[i]: i for i in range(len(nums)) }
          for i in range(len(nums)):
               # 更具目標(biāo)值浆兰,求出剩余值
               complement = target - nums[i]
               # 查看字典是否有符合的
               if nums_dict.get(complement) and nums_dict.get(complement) != i:
                   return [i, nums_dict.get(complement)]

這里還是使用了兩次 for 循環(huán),但卻是一維的珊豹,時(shí)間復(fù)雜度也相對(duì)變成了 O(n)

執(zhí)行時(shí)間

JavaScript


    var twoSum = function(nums, target) {
        let num_json = {}
        nums.forEach((item, index) => {
            num_json[item] = index
        })
        
        for (let i in nums) {
            let complement = target - nums[i]
            
            if (num_json[complement] && num_json[complement] != i) {
                return [i - 0, num_json[complement] ]
            }
        }
    };

    let nums = [2, 7, 11, 15, 3, 6, 4, 5];
    let result = twoSum(nums, 9)
    console.log(result)

image.png

一遍哈希表

循環(huán)一次簸呈,獲取結(jié)果。在進(jìn)行迭代并將元素插入到表中的同時(shí)店茶,我們還會(huì)回過頭來檢查表中是否已經(jīng)存在當(dāng)前元素所對(duì)應(yīng)的目標(biāo)元素蜕便。如果它存在,那我們已經(jīng)找到了對(duì)應(yīng)解忽妒,并立即將其返回玩裙。

    def twoSum(self, nums, target):
          """
          :type nums: List[int]
          :type target: int
          :rtype: List[int]
          """
          nums_dict = {}
          
          # 創(chuàng)建字典,列表值為key段直,索引為 value
          for i in range(len(nums)):
                # 根據(jù)目標(biāo)值吃溅,求出剩余值
                complement = target - nums[i]
                
                if complement in nums_dict:
                     return [i, nums_dict.get(complement)]
                     
                nums_dict[nums[i]] = i               
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸯檬,隨后出現(xiàn)的幾起案子决侈,更是在濱河造成了極大的恐慌,老刑警劉巖喧务,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖歌,死亡現(xiàn)場離奇詭異,居然都是意外死亡功茴,警方通過查閱死者的電腦和手機(jī)庐冯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坎穿,“玉大人展父,你說我怎么就攤上這事×崦粒” “怎么了栖茉?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孵延。 經(jīng)常有香客問我吕漂,道長,這世上最難降的妖魔是什么尘应? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任惶凝,我火速辦了婚禮,結(jié)果婚禮上菩收,老公的妹妹穿的比我還像新娘梨睁。我一直安慰自己,他們只是感情好娜饵,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布坡贺。 她就那樣靜靜地躺著,像睡著了一般箱舞。 火紅的嫁衣襯著肌膚如雪遍坟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天晴股,我揣著相機(jī)與錄音愿伴,去河邊找鬼。 笑死电湘,一個(gè)胖子當(dāng)著我的面吹牛隔节,可吹牛的內(nèi)容都是我干的鹅经。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼怎诫,長吁一口氣:“原來是場噩夢啊……” “哼瘾晃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幻妓,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤蹦误,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肉津,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體强胰,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年妹沙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偶洋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡距糖,死狀恐怖涡真,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肾筐,我是刑警寧澤哆料,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吗铐,受9級(jí)特大地震影響东亦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唬渗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一典阵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镊逝,春花似錦壮啊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至座菠,卻和暖如春狸眼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浴滴。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工拓萌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人升略。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓微王,卻偏偏與公主長得像屡限,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炕倘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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

  • 問題描述: 給定一個(gè)整數(shù)數(shù)組和一個(gè)目標(biāo)值囚霸,找出數(shù)組中和為目標(biāo)值的兩個(gè)數(shù)。 你可以假設(shè)每個(gè)輸入只對(duì)應(yīng)一種答案激才,且同樣...
    sqing啊閱讀 521評(píng)論 0 0
  • 1.兩數(shù)之和 給定一個(gè)整數(shù)數(shù)組和一個(gè)目標(biāo)值,找出數(shù)組中和為目標(biāo)值的兩個(gè)數(shù)额嘿。你可以假設(shè)每個(gè)輸入只對(duì)應(yīng)一種答案瘸恼,且同樣...
    Gunther17閱讀 1,027評(píng)論 2 6
  • “你在南方的艷陽里东帅,大雪紛飛;我在北方的寒夜里球拦,四季如春靠闭。” 聽到這首歌的時(shí)候坎炼,仿佛歌詞中的每一個(gè)字我都深懷感觸愧膀。...
    樂閱讀書閱讀 268評(píng)論 0 0
  • 開始說話吧檩淋,表達(dá)自己表達(dá)自己,對(duì)我來說是有點(diǎn)挺困難的萄金,因?yàn)槲也涣?xí)慣或者不擅長口頭上是表達(dá)自己蟀悦。 一直以來,我都挺不...
    梁超文閱讀 339評(píng)論 2 3
  • 今天是我早起的第十八天,從理論上來說孙乖,這還不是一個(gè)固定的習(xí)慣浙炼,而我起床的時(shí)間也不是太早,6點(diǎn)左右唯袄。這個(gè)時(shí)間比起5點(diǎn)...
    藝小姐閱讀 447評(píng)論 0 4