算法 - 字典

字典

  • 與集合類似姻成,字典也是一種存儲唯一值的數(shù)據(jù)結(jié)構(gòu)也祠,但它是以鍵值對的形式來存儲
  • ES6中有字典谴供,名為Map
  • 字典的常用操作:鍵值對的增刪改查
const map = new Map()

// 增加
map.set('a': 'aa')
map.set('b': 'bb')

// 獲取
map.get('a')

// 改
map.set('a': 'aaa')

// 刪除
map.delete('b')

// 刪除所有
map.clear()

兩個數(shù)組的交集

leeCode第349題

  • 之前使用集合來解決,現(xiàn)在使用字典來解決
  • 求 nums1 和 nums2 都有的值
  • 用字典建立一個映射關(guān)系齿坷,記錄 nums1 里有的值,填充字典
  • 遍歷 nums2数焊,遇到字典里的值就選出永淌,并從字典中刪除
const intersection = function(nums1, nums2) {
    const map = new Map()
    nums1.forEach(num => {
        map.set(num, true)
    });

    const res = []
    nums2.forEach(num => {
        if(map.get(num)) {
            res.push(num)
            map.delete(num)
        }
    })

    return res
};

const arr1 = [1,2,2,1] // [4,9,5]
const arr2 = [1,2] // [9,4,9,8,4]
const res = intersection(arr1, arr2)
console.log(res)

有效的括號

leeCode第20題

  • 之前是使用棧來解決的,現(xiàn)在使用字典來解決
  • 通過定義字典佩耳,左括號則入棧遂蛀,否則取出棧頂字典值判斷是否一致
  • 之前解法為了兼容里面有非括號,但是重新看了一下題目其實已經(jīng)說了輸入只有括號符干厚,所以沒必要特地去處理其他字符
const isValid = function(s) {
    if (s.length % 2) return false
    const stack = []
    const map = new Map()

    map.set('(', ')')
    map.set('{', '}')
    map.set('[', ']')

    for (let i = 0; i < s.length; i++) {
        const c = s[i]
        if (map.has(c)) {
            stack.push(c)
        } else {
            const t = stack[stack.length - 1]
            if (map.get(t) === c) {
                stack.pop()
            } else {
                return false
            }
        }
    }

    return !stack.length
}

console.log(isValid("()"))
console.log(isValid("()[]{}"))
console.log(isValid("([)]"))
console.log(isValid("{[]}"))
console.log(isValid("{[]"))

兩數(shù)之和

leeCode第1題

  • target為匹配條件
  • 先進入的nums為匹配者李滴,如果沒找到合適的則記錄本身匹配答案
const twoSum = function(nums, target) {
    const map = new Map()

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

        if (map.has(n2)) {
            return [map.get(n2), i]
        } else {
            map.set(n, i)
        }
    }
}

console.log(twoSum([2,7,11,15], 9))
console.log(twoSum([3,2,4], 6))
console.log(twoSum([3,3], 6))

無重復(fù)字符的最長子串

leeCode第3題

  • 用雙指針維護一個滑動窗口螃宙,用來剪切字符串
  • 不斷移動右指針,遇到重復(fù)字符所坯,就把左指針移動到重復(fù)字符的下一位
  • 找出長度最大那個子串谆扎,返回其長度即可
const lengthOfLongestSubstring = function(s) {
    let l = 0
    let res = 0
    const map = new Map()

    for (let r = 0; r < s.length; r++) { // 不停移動右指針
        if (map.has(s[r]) && map.get(s[r]) >= l) { // 如果重復(fù)的數(shù)字比左指針下標(biāo)少則證明被排除在外了,無需管
            l = map.get(s[r]) + 1
        }
        res = Math.max(res, r - l + 1) // 記錄字符最大值
        map.set(s[r], r) // 記錄該字符下標(biāo)
    }
    return res
}


console.log(lengthOfLongestSubstring('abcabcbb'))
console.log(lengthOfLongestSubstring('bbbbb'))
console.log(lengthOfLongestSubstring('pwwkew'))
console.log(lengthOfLongestSubstring('abbcdea'))

最小覆蓋子串

leeCode第76題

  • 用雙指針維護一個滑動窗口
  • 移動右指針芹助,找到包含T的子串堂湖,移動左指針,盡量減少包含T的子串的長度
  • 循環(huán)上述過程状土,找到包含T的最小子串
const minWindow = function(s, t) {
    let l = 0
    let r = 0
    const map = new Map()
    for (let c of t) {
        map.set(c, map.has(c) ? map.get(c) + 1 : 1)
    }
    let needType = map.size
    let res = ''

    while (r < s.length) {
        const c = s[r]
        if (map.has(c)) {
            map.set(c, map.get(c) - 1)

            if (map.get(c) === 0) needType--
        }
        while (needType === 0) {
            const newRes = s.substring(l, r + 1)
            if (!res || newRes.length < res.length) res = newRes
            const c2 = s[l]
            if (map.has(c2)) {
                map.set(c2, map.get(c2) + 1)
                if (map.get(c2) === 1) needType++
            }
            l++
        }
        r++
    }
    return res
}

console.log(minWindow('ADOBECODEBANC', 'ABC'))
console.log(minWindow('a', 'a'))
?著作權(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é)果婚禮上,老公的妹妹穿的比我還像新娘若河。我一直安慰自己能岩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布萧福。 她就那樣靜靜地躺著拉鹃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膏燕,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天钥屈,我揣著相機與錄音,去河邊找鬼坝辫。 笑死篷就,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阀溶。 我是一名探鬼主播腻脏,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼银锻!你這毒婦竟也來了永品?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤击纬,失蹤者是張志新(化名)和其女友劉穎鼎姐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體更振,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡炕桨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肯腕。 大學(xué)時的朋友給我發(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
  • 正文 我出身青樓璧坟,卻偏偏與公主長得像既穆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雀鹃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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