Javascript新法解舊題之【兩數(shù)之和】

Javascript新法解舊題之【兩數(shù)之和】

題目如下:

給定一個整數(shù)數(shù)組和一個目標(biāo)值嫌变,找出數(shù)組中和為目標(biāo)值的兩個數(shù)吨艇。

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

示例

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

因為 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]

leetCood地址:兩數(shù)之和

題目不難理解东涡,首先一上來我們馬上就能想到使用兩個循環(huán)解決的辦法。

遍歷所有組合倘待,找到符合要求的組合就行疮跑。

雙層循環(huán)

代碼如下:

const twoSum = (nums, target) => {
    let arr = [];
    for(let i = 0; i < nums.length; i++) {
        for(let j = i + 1; j < nums.length; j++) {
            if (nums[i] + nums[j] === target) {
                arr = [i, j];
                break;
            }
        }
    }
    return arr;
};

兩個循環(huán),時間復(fù)雜度為O(N*N)凸舵。

leetCode測試數(shù)據(jù)如下:

我的提交執(zhí)行用時已經(jīng)戰(zhàn)勝 17.42 % 的 javascript 提交記錄

在第二個循環(huán)中祖娘,我們只是要尋找目標(biāo)值是否在數(shù)組里,因此可想到j(luò)avascript中的一個方法----indexOf啊奄。

indexOf 用法

代碼可改寫如下:

const twoSum = (nums, target) => {
    let a, b;
    for(let i = 0; i < nums.length; i++) {
        b = nums.indexOf(target - nums[i]);
        if(b > -1 && b !== i) {
            a = i;
            break;
        }
    }
    return [a, b];
};

但是 ArrayindexOf 方法實際上是對數(shù)組再遍歷一次渐苏,雖然在寫法上有優(yōu)化,但是實際時間復(fù)雜度還是O(N*N)菇夸。

在時間復(fù)雜度上做優(yōu)化琼富,我們需要解決一個問題,如何快速地在數(shù)組中檢索值庄新?使用 indexOf 其實已經(jīng)在數(shù)據(jù)中檢索特定值的思路上了鞠眉。只不過 indexOf 內(nèi)部還是對數(shù)組進行循環(huán)檢索薯鼠,因此并沒有達到更快的要求。在這方面械蹋, hash表 可以幫助到我們出皇。

什么意思呢?比如我們有一個對象 obj = { ..., a: 1} 朝蜘,當(dāng)我們?nèi)≈?Obj.a 時恶迈,是個直接尋址的過程,因此效率是很高的谱醇∠局伲回到題目,在這個思路上改進我們的代碼:

使用對象索引

const twoSum = (nums, target) => {
    let mapObj = {};
    let res = [];
    nums.forEach((e, i) => mapObj[e] = i);

    for(let i=0;i<nums.length;i++) {
        let j = mapObj[targer - nums[i]];
        if(j && j !== i) {
            res = [i, j];
            break;
        }
    }

    return res;
};

我們創(chuàng)建一個對象副渴,并給它賦值奈附,對象的鍵值是我們想要檢索的值,對象的值是在數(shù)組中的索引煮剧。

雖然多了創(chuàng)建對象這一過程斥滤,但是我們少了一層循環(huán)。

然后我們來看執(zhí)行效率:

我的提交執(zhí)行用時已經(jīng)戰(zhàn)勝 86.24 % 的 javascript 提交記錄勉盅。

17.42 %86.24 %佑颇,可以說是個質(zhì)的飛躍。

es6 中草娜,給我們提供了一個新對象 Map挑胸,在這里就可以拍上用途。

使用 map

const twoSum = (nums, target) => {
    let map = new Map();
    let res = [];
    nums.forEach((e, i) => map.set(e, i));

    for(let i=0;i<nums.length;i++) {
        let j = map.get[targer - nums[i]];
        if(j && j !== i) {
            res = [i, j];
            break;
        }
    }

    return res;
};

最終使用 Map 優(yōu)化的代碼宰闰,讓我們戰(zhàn)勝了 97.21 % 的提交茬贵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市移袍,隨后出現(xiàn)的幾起案子解藻,更是在濱河造成了極大的恐慌,老刑警劉巖葡盗,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟左,死亡現(xiàn)場離奇詭異,居然都是意外死亡觅够,警方通過查閱死者的電腦和手機路狮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔚约,“玉大人奄妨,你說我怎么就攤上這事∑凰睿” “怎么了砸抛?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵评雌,是天一觀的道長。 經(jīng)常有香客問我直焙,道長景东,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任奔誓,我火速辦了婚禮斤吐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厨喂。我一直安慰自己和措,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布蜕煌。 她就那樣靜靜地躺著派阱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斜纪。 梳的紋絲不亂的頭發(fā)上贫母,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音盒刚,去河邊找鬼腺劣。 笑死,一個胖子當(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
  • 我被黑心中介騙來泰國打工界斜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人合冀。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓各薇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親君躺。 傳聞我的和親對象是個殘疾皇子峭判,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,151評論 0 13
  • JavaScript棕叫,通沉煮Γ縮寫為 JS,是一種解釋執(zhí)行的編程語言俺泣。它是現(xiàn)在最流行的腳本語言之一疗认。 JavaScri...
    神齊閱讀 4,893評論 1 32
  • 【1】 璽自從今年4月份去學(xué)校吃午餐,慢慢的家中晚餐食欲就沒有以前好了伏钠。 原本想她去學(xué)校吃完午餐后可以做些家庭作業(yè)...
    走向陽光的自己閱讀 230評論 3 1
  • 在閑魚上買過一次也賣過一次寶貝横漏,閑魚水太深,往往會收到驚喜熟掂。閑魚的閑不是出閑置缎浇,而是閑人玩的地方吧。 Ps:已卸載赴肚。
    驍龍閱讀 107評論 0 0
  • 一大早被狗咬
    日落絢閱讀 85評論 0 0