算法| ss 哈希表

  • 1.两数之和
  • 219.存在重复元素 2
  • 242.有效的字母异位词
  • 349.两个数组的交集
  • 49.字母异位词分组

1.两数之和

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
// 思路
// for循环遍历nums
// 创建map, key= 目标值-nums[i]
// key对应的值存在,则有结果, 结果为 map[cur] i
// key对应的值不存在, 则往map里添加该key
var twoSum = function (nums, target) {
  const map = {};
  let ans = [];
  for (let i = 0; i < nums.length; i++) {
    let key = target - nums[i];
    if (map[key] !== undefined) {
      ans[0] = map[key];
      ans[1] = i;
      break;
    } else {
      map[nums[i]] = i;
    }
    // console.log(map);
  }
  //   console.log(ans);
  return ans;
};
twoSum([2, 7, 11, 15], 9);
// 输入:nums = [2,7,11,15], target = 9
// 输出:[0,1]

219.存在重复元素2

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
// 思路
// 维持一个k长度的set集合
// 建立sets集合
// 如果集合里有数据了 则返回true
// 加入数据到集合
// 如果sets长度超过k了, 则删除第一个
var containsNearbyDuplicate = function (nums, k) {
  const sets = new Set();
  for (let i = 0; i < nums.length; i++) {
    if (sets.has[nums[i]]) return true;
    sets.add(nums[i]);
    if (sets.size > k) {
      sets.delete(nums[i - k]);
    }
  }
  return false;
};
console.log(containsNearbyDuplicate([1, 2, 3, 1], 3));
console.log(containsNearbyDuplicate([1, 2, 3, 1, 2, 3], 2));
// nums = [1,2,3,1], k = 3

242.有效的字母异位词

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
// 思路
// 判断s t的长度是否相等
// 统计s的map统计
// 循环遍历t, 对map进行减法操作
// 最后判断map中所有的值是否为0
var isAnagram = function (s, t) {
  if (s.length != t.length) return false;
  const map = {};
  for (let ch of s) {
    map[ch] = (map[ch] ?? 0) + 1;
  }
  for (let ch of t) {
    if (map[ch]) {
      map[ch] -= 1;
    }
  }
  let ans = Object.values(map).every((item) => item === 0);
  console.log(ans);
  return ans;
};
isAnagram("anagram", "nagaram");
isAnagram("rat", "car");
// s = "anagram", t = "nagaram"

349.两个数组的交集

/** 349. 两个数组的交集(集合去重后筛选、优化、字典)
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
// 思路
// Set的使用
var intersection = function (nums1, nums2) {
  const sets = new Set(nums1);
  const ans = new Set();
  for (let i = 0; i < nums2.length; i++) {
    if (sets.has(nums2[i])) {
      ans.add(nums2[i]);
    }
  }
  console.log([...ans]);
  return [...ans];
};
intersection([1, 2, 2, 1], [2, 2]);
// nums1 = [1,2,2,1], nums2 = [2,2]

49. 字母异位词分组

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
// 思路
// 构建map对象
// for遍历
// 将元素分割 排序, 再合并
// 存入对象中,如果有则追加
// 将对象key对应的数组输出
var groupAnagrams = function (strs) {
  const map = new Map();
  for (let str of strs) {
    const key = str.split("").sort().join();
    if (map.has(key)) {
      map.get(key).push(str);
    } else {
      map.set(key, [str]);
    }
  }
  console.log([...map.values()]);
  return [...map.values()];
};
// strs = ["a"]
groupAnagrams(["a"]);

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值