研习算法第五站-字典(javascript版)

174 阅读1分钟

字典简介

  • 与集合类型,字典也是一种存储唯一值的数据结构,但它是以键值对的形式存储的
  • ES6 中有字典,名为Map
  • 常用操作:键值对的增删改查
const m = new Map();

// 增
m.set("name", "掘金");
m.set("age", 18).set("gender", 1);

// 删
// 返回 true
m.delete("name");
// 返回 false
m.delete("name1");

// 改 二次使用就覆盖
m.set("age", 19);

// 查
// 返回 undefined
m.get("name1");
// 返回 19
m.get("age");

// 清除 所有
m.clear();

// 返回 0
m.size;

leetcode-cn.com 算法题实战

完整题目请打开 leetcode

WX20211021-000954@2x.png

解题思路

  • 求nums1 和 nums2 都有的值
  • 使用字典建立 nums1 的唯一值映射
  • 循环nums2 把在映射中的值放入数组中,并把找到的值相应映射删除
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
 var intersection = function(nums1, nums2) {
    const m = new Map();
    const arr = [];
    for(let c of nums1) {
        m.set(c,true);
    }
    for(let c of nums2) {
        if(m.has(c)) {
            arr.push(c);
            m.delete(c)
        }
    }
    return arr;
};

image.png

解题思路

  • 先找出所有的包含T的子串
  • 找出长度最小的那个子串
  • 用双指针维护一个滑动的窗口
  • 移动右指针,找到包含T的子串,移动左指针,尽量减少包含T的子串的长度
/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
 var minWindow = function(s, t) {
    let l = 0;
    let r = 0;
    let res = '';
    const need = new Map();
    for(let i of t) {
        need.set(i, need.get(i) ? need.get(i) + 1 : 1)
    }
    let needTypeLength = need.size;
  
    while(r < s.length) {
        const c = s[r];
    
        if(need.has(c)) {

            need.set(c, need.get(c) - 1);
            if(need.get(c) === 0) {
                needTypeLength -= 1;
            }
        }
        while(needTypeLength === 0){
            let newRes = s.substring(l, r +1);
        
            if(!res || newRes.length < res.length) {
                res = newRes;
            }
            const c2 = s[l];

            if(need.has(c2)){
                need.set(c2, need.get(c2) + 1 );
                if(need.get(c2) === 1) {
                    needTypeLength += 1;
                }

            }
            l += 1;
        }


        r+= 1;
    }
    return res;
};

下一站 树