美文网首页算法
算法 - 字典

算法 - 字典

作者: 羽晞yose | 来源:发表于2021-03-07 23:28 被阅读0次

字典

  • 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储
  • 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()

两个数组的交集

leeCode第349题

  • 之前使用集合来解决,现在使用字典来解决
  • 求 nums1 和 nums2 都有的值
  • 用字典建立一个映射关系,记录 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题

  • 之前是使用栈来解决的,现在使用字典来解决
  • 通过定义字典,左括号则入栈,否则取出栈顶字典值判断是否一致
  • 之前解法为了兼容里面有非括号,但是重新看了一下题目其实已经说了输入只有括号符,所以没必要特地去处理其他字符
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("{[]"))

两数之和

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))

无重复字符的最长子串

leeCode第3题

  • 用双指针维护一个滑动窗口,用来剪切字符串
  • 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的下一位
  • 找出长度最大那个子串,返回其长度即可
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) { // 如果重复的数字比左指针下标少则证明被排除在外了,无需管
            l = map.get(s[r]) + 1
        }
        res = Math.max(res, r - l + 1) // 记录字符最大值
        map.set(s[r], r) // 记录该字符下标
    }
    return res
}


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

最小覆盖子串

leeCode第76题

  • 用双指针维护一个滑动窗口
  • 移动右指针,找到包含T的子串,移动左指针,尽量减少包含T的子串的长度
  • 循环上述过程,找到包含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'))

相关文章

  • 算法 - 字典

    字典 与集合类似,字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储 ES6中有字典,名为Map 字典的...

  • MOOC大学 实用Python程序设计 W7 字典和集合

    7.1 字典的基本概念 7.2 字典相关函数 7.3 字典例题 7.4 集合 7.5 程序和算法的时间复杂度 7....

  • 字典序算法

    题目:给定一个正整数,实现一个方法来求出离该整数最近的大于自身的“换位数”。 换位数:把一个整数各个数位的数字进行...

  • 字典排序算法

    在数学,字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法...

  • 字典序算法

    背景 今天群里有人问了一个问题:取出刚刚好大于自己的换位数(后来才知道这就是"字典序算法"),然后自己思考了一下用...

  • Swift 算法实战二(二叉树、二分搜索)

    Swift 算法实战一(集合,字典,链表,栈,队列等算法) Swift 算法实战二(二叉树、二分搜索) 前言 这是...

  • Swift 算法实战一(集合,字典,链表,栈,队列等算法)

    Swift 算法实战一(集合,字典,链表,栈,队列等算法) Swift 算法实战二(二叉树、二分搜索) 前言 用 ...

  • OC数组大小排序算法

    1、要排序的数组如下,数字里面是字典,字典有两对键值对,数组需要按照字典里temp大小进行排序。 2、排序算法如下...

  • 字典树

    功能 字典树是用数组存储大量字符串的一种算法 字典树算法开辟空间非常大,但是对于字符串插入和查询有很快的速度 用法...

  • 跟着java源码学算法--散列表(hashMap源码分析)

    定义    散列表又叫哈希表,字典表,故名思义,是一种依据hash算法实现的类似字典的数据结构。比如,我们查字典查...

网友评论

    本文标题:算法 - 字典

    本文链接:https://www.haomeiwen.com/subject/mcpuqltx.html