数据结构-集合&字典

127 阅读2分钟

集合

1,特点

无序且唯一的结构,ES6中用集合用Set

2,操作
  • 去重
  • 判断元素是否在集合中
  • 求交集
3,演示
      const set = new Set();
      set.size; // 值的个数
      set.add(1); // 向Set中添加一个对象;返回该Set对象
      set.clear(); // 移除所有元素
      set.delete(1); // 移除某个元素
      set.has(1); // 是否存在
      // set.entries  set.forEach set.values set.keys  迭代器
      // 转换
      Arry.from(set);  
      new Set([]);

      //  去重
      const arr = [1, 2, 3, 4, 4, 5];
      const arr2 = [...new Set(arr)];

      // 判断元素是否在集合中
      const set1 = new Set(arr);
      set.has(3);

      // 求交集
      const set2 = new Set([2, 3]);
      const set3 = new Set([...set1].filter((item) => set2.has(item)));
4,练习题

349. 两个数组的交集

     //给定两个数组,编写一个函数来计算它们的交集。
    // 用集合对nums1去重,遍历nums1 筛选nums2也包含的值
    
   var intersection = function (nums1, nums2) {
        //return [... new Set(nums1)].filter(item=> new Set(nums2).has(item));
        return [...new Set(nums1)].filter((item) => nums2.includes(item));
   };

字典

1,特点

与集合类似,字典存储唯一值类型的数据结构,是以键值对的形式来存储;ES6中用Map存储;

2,操作

键值对的增删改查;

3,演示
      const map = new Map();
      // 增
      map.set("a", "aa");
      map.set("b", "bb");
      // 改
      map.set("a", "aaa");
      // 查
      map.get("a");
      // 删除
      map.delete("b", "bb");
      map.clear();
      // 键值对的个数
      map.size;
      // 迭代器方法
      map.forEach map.keys map.values map.entries
4,练习题

还是上面349;

      var intersection = function (nums1, nums2) {
        //   return [... new Set(nums1)].filter(item=> new Set(nums2).has(item));
        //  return [... new Set(nums1)].filter(item=> nums2.includes(item));
        const map = new Map();
        nums1.forEach((item) => {
          map.set(item, true);
        });
        const res = [];
        nums2.forEach((item) => {
          if (map.has(item)) { 
            res.push(item);
            map.delete(item);// 删除防止重复
          }
        });
        return res;
      };

20. 有效的括号

      var isValid = function (s) {
        if (s.length % 2 !== 0) return false;
        const stack = [];
        // 建立映射关系
        const map = new Map();
        map.set("(", ")");
        map.set("[", "]");
        map.set("{", "}");
        for (let i = 0; i < s.length; i++) {
          let str = s[i];
          if (map.has(str)) {
            stack.push(str);
          } else {
            const temp = stack[stack.length - 1];
            if (map.get(temp) === str) {
              stack.pop();
            } else {
              return false;
            }
          }
        }
        return stack.length === 0;
      };
      

1. 两数之和

    // 用字典建立一种映射关系;把需要的坐标和自己的坐标建立映射关系;
      var twoSum = function (nums, target) {
        const map = new Map();
        for (let i = 0; i < nums.length; i++) {
          let temp = nums[i];
          let current = target - temp;
          if (map.has(temp)) { // 有需要的返回
            return [map.get(temp), i];
          } else {
            map.set(current, i); // 没有需要的登记
          }
        }
      };

3. 无重复字符的最长子串

  // 用双指针维护一个滑动窗口,用来剪切子串
  // 不断右移动指针,避免重复字符,就把左指针移动到重复字符的下一位
  // 过程中,记录所有窗口的长度,并返回最大值
  var lengthOfLongestSubstring = function (s) {
    let l = 0;
    let max = 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;
      }
      map.set(s[r], r);
      max = Math.max(max, r - l + 1);
    }
    return max;
  };

76. 最小覆盖子串

//  用双指针维护一个滑动窗口
//  移动右指针,找到包含T的子串,移动左指针,尽量减少包含T的子串的长度;
var minWindow = function(s, t) {
    let map = new Map();
    for (let i= 0; i<t.length;i++) {
        const val = t[i];
        map.set(val,map.has(val)?map.get(val)+1:1)
    }
    let size = map.size;
    let l = 0;
    let r = 0;
    let str = '';
    while(r<s.length){
        let cr = s[r];
        if (map.has(cr)) {
            map.set(cr,map.get(cr)-1);
            if (map.get(cr)===0) size--; 
        }
        while(size===0) {
            const newStr = s.substring(l,r+1);
            if (str) {
                str = newStr.length<str.length?newStr:str;
            }else {
                str = newStr;
            }
            const cl = s[l];
            if (map.has(cl)) {
                map.set(cl,map.get(cl)+1);
                if (map.get(cl)===1) size++;
            }
            l++;
        }
        r++;
    }
    return str;
};