2019 算法面試相關(leetcode)--哈希表

2019 iOS面試題大全---全方面剖析面試
2018 iOS面試題---算法相關
1盛杰、七種常見的數(shù)組排序算法整理(C語言版本)
2飘痛、2019 算法面試相關(leetcode)--數(shù)組和鏈表
3、2019 算法面試相關(leetcode)--字符串
4、2019 算法面試相關(leetcode)--棧和隊列
5、2019 算法面試相關(leetcode)--優(yōu)先隊列
6、2019 算法面試相關(leetcode)--哈希表
7孟辑、2019 算法面試相關(leetcode)--樹、二叉樹蔫敲、二叉搜索樹
8饲嗽、2019 算法面試相關(leetcode)--遞歸與分治
9、2019 算法面試相關(leetcode)--貪心算法
10奈嘿、2019 算法面試相關(leetcode)--動態(tài)規(guī)劃(Dynamic Programming)
11貌虾、2019 算法面試相關(leetcode)--動態(tài)規(guī)劃之背包問題


哈希表相關的原理可以參考下:
淺談哈希表(HashTable)
深入理解哈希表
哈希表的理解
理解HashSet及使用

哈希表最突出的優(yōu)點就是查找時間復雜度是o(1),所以其應用場景多數(shù)為查找
哈希表和集合另一個特性是無重復裙犹,可以用來計數(shù)


1. 兩數(shù)之和

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

你可以假設每種輸入只會對應一個答案袄膏。但是,你不能重復利用這個數(shù)組中同樣的元素掺冠。

示例:

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

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]


這道題目也是leetcode第一題,我們可以利用哈希表沉馆,在哈希表中查找是否有target-nums[i],存在則返回,否則將nums[i]存入哈希表中

var twoSum = function(nums, target) {
    
    let dict = {}
    
    for (let i = 0; i < nums.length; i++) {

        if ((target - nums[i]) in dict) return [dict[target-nums[i]], i]

        dict[nums[i]] = i
    }
};
2. 有效的字母異位詞

給定兩個字符串 s 和 t 斥黑,編寫一個函數(shù)來判斷 t 是否是 s 的一個字母異位詞揖盘。

示例 1:

輸入: s = "anagram", t = "nagaram"
輸出: true
示例 2:

輸入: s = "rat", t = "car"
輸出: false
說明:
你可以假設字符串只包含小寫字母。

進階:
如果輸入字符串包含 unicode 字符怎么辦锌奴?你能否調(diào)整你的解法來應對這種情況兽狭?


題目意思很簡單,判斷兩個字符串是否有同樣的字符缨叫,字符以及字符的數(shù)量都要相同椭符。
我們同樣可以用哈希表來解決,現(xiàn)將第一個字符串的字符及數(shù)量保存到哈希表中耻姥,然后去和第二個字符串對比,完全一致則返回true否則返回false有咨。

  • 計數(shù)也是哈希表一個比較常見的使用場景
var isAnagram = function(s, t) {

    let dic = {}

    for (const c of s) {

       dic[c] = (dic[c] || 0) + 1
    }

    for (const c of t) {
        
        if(c in dic) dic[c]--

        else return false
    }

    for (const key in dic) {
        
        if(dic[key] != 0) return false
    }

    return true
};

還有一種比較簡單的寫法琐簇,就是分別對兩個字符串分別排序然后判斷是否相同,不過只是寫起來簡單,實際時間復雜度是o(logn)座享,比上邊的方法效率要差一些婉商,不建議這樣寫哈。

var isAnagram = function(s, t) {

    return s.split('').sort().join('') == t.split('').sort().join('')
};
3. 三數(shù)之和

給定一個包含 n 個整數(shù)的數(shù)組 nums渣叛,判斷 nums 中是否存在三個元素 a丈秩,b,c 淳衙,使得 a + b + c = 0 蘑秽?找出所有滿足條件且不重復的三元組。

注意:答案中不可以包含重復的三元組箫攀。

例如, 給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4]肠牲,

滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]


  • 1.首先如果我們用暴力法的話,就是三層嵌套循環(huán)靴跛,時間復雜度為o(n^3),效率很低,leetcode執(zhí)行超時

  • 2.我們可以將a+b+c = 0轉(zhuǎn)化成a + b = -c缀雳,這樣就轉(zhuǎn)化成了第一題兩數(shù)之和了。這里同樣可以用hashSet查找來去重

var threeSum = function(nums) {
    
    nums.sort((a,b) => a - b)

    let result = []

    let resSet = new Set()

    for (let i = 0; i < nums.length - 2; i++) {
        
        let set = new Set()

        for(let j = i + 1; j < nums.length; j++){
            
            let target = 0-(nums[i] + nums[j])

            if(set.has(target)){

                let arr = [nums[i],nums[j],target]

                let tmp = arr
        
                tmp = tmp.sort().join(',')

                if(!resSet.has(tmp)){

                    result.push(arr)

                    resSet.add(tmp)
                }
                
            }else set.add(nums[j])
        }
    }

    return result
};

這種方法的時間復雜度是o(n^2),效率還是挺低梢睛。

  • 3.這里可以使用雙指針法肥印。首先將數(shù)組排序(排序是為了后續(xù)方便),遍歷數(shù)組绝葡,target就是-nums[i]了深碱,由于數(shù)組是排好序的,所以如果target小于0挤牛,就可以跳出循環(huán)了莹痢,另外由于題目要求不能有重復三元組,所以遇到相同的就不處理,繼續(xù)向后循環(huán)竞膳。
    然后再利用左右雙指針去遍歷數(shù)組航瞭,由于數(shù)組是有序的,就可以根據(jù)兩個指針對應元素值與-nums[i]值相比是大還是小來決定循環(huán)的方向坦辟,循環(huán)過程中同樣要跳過相同的元素刊侯,直到等于-nums[i]
var threeSum = function(nums) {

    nums.sort((a,b)=>a-b)
    
    let result = []

    for (let i = 0; i < nums.length; i++) {
        
        let target = -nums[i];

        if(target < 0) break;

        if(i>0 && nums[i]==nums[i-1]) continue;

        let j = i + 1,k = nums.length - 1

        while(j < k){

            
            if(nums[j] + nums[k] == target){
                
                while(j<k && nums[j] === nums[j+1])
                   ++j;
               
               while(j<k && nums[k] === nums[k-1])
                   --k;

                let pushArr = [nums[i], nums[j++],nums[k--]]

                result.push(pushArr)

            }else if (nums[j] + nums[k] < target) {
                
                j++;

            }else {
                
                k--;
            }
        }
    }

    return result
};

這種方法的時間復雜度同樣是o(n^2),但不再需要用到set去保存,空間復雜度有優(yōu)化锉走。另外先排序的情況下會規(guī)避掉很多不必要的操作滨彻,也不需要再用set去去重,在測試用例不是特別大的情況下挪蹭,實際運行起來要比上邊的快不少

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亭饵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子梁厉,更是在濱河造成了極大的恐慌辜羊,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件词顾,死亡現(xiàn)場離奇詭異八秃,居然都是意外死亡,警方通過查閱死者的電腦和手機肉盹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門昔驱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人上忍,你說我怎么就攤上這事骤肛。” “怎么了睡雇?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵萌衬,是天一觀的道長。 經(jīng)常有香客問我它抱,道長秕豫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任观蓄,我火速辦了婚禮混移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侮穿。我一直安慰自己歌径,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布亲茅。 她就那樣靜靜地躺著回铛,像睡著了一般狗准。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵肃,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天腔长,我揣著相機與錄音,去河邊找鬼验残。 笑死捞附,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的您没。 我是一名探鬼主播鸟召,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氨鹏!你這毒婦竟也來了欧募?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤喻犁,失蹤者是張志新(化名)和其女友劉穎槽片,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肢础,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年碌廓,在試婚紗的時候發(fā)現(xiàn)自己被綠了传轰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谷婆,死狀恐怖慨蛙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纪挎,我是刑警寧澤期贫,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站异袄,受9級特大地震影響通砍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烤蜕,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一封孙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讽营,春花似錦虎忌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽堪藐。三九已至,卻和暖如春挑围,著一層夾襖步出監(jiān)牢的瞬間礁竞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工贪惹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苏章,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓奏瞬,卻偏偏與公主長得像枫绅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子硼端,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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

  • 今天是12月7號并淋,農(nóng)歷十月初一,大雪珍昨,天氣晴县耽。 我在寒風中,四周是白茫茫一片镣典,空中偶爾飄著幾片雪花兔毙,像是在訴說著昨...
    青楓煦閱讀 510評論 6 3
  • 前言 今天的題目每天的題目見github(看最新的日期):https://github.com/gzc426具體的...
    程序員喬戈里閱讀 206評論 0 0
  • 早上小姑子打電話來了,問外甥女在干什么兄春?外甥女說在畫畫澎剥,舅媽還教她認字。小姑子很開心赶舆,和我通電話哑姚,說讓我教她...
    Susie麗閱讀 324評論 1 1
  • 孤獨叙量,什么是孤獨?我無以言表九串,更無處訴說绞佩。或許蒸辆,是時刻不忘點開QQ,查看是否有自己的私人消息征炼,如果沒有,繼續(xù)保持希...
    G_Andy閱讀 189評論 0 0