六、有效的字母异位词 两个数组的交集 快乐数 两数之和

搞清楚什么时候用哈希表:

需要快速判断一个元素是否会出现在集合中,就要考虑哈希表

常见三种哈希结构:

  • 数组
  • set(集合)
  • map(映射)

去重用set、记录出现次数用map

有效的字母异位词

 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章链接:代码随想录

视频链接:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词_哔哩哔哩_bilibili

解法:

map:

遍历s,map记录s中各个字母出现的次数,遍历t,在map相同字母--,遍历map如果value不等于0,则说明两个字符串不完全相等

public boolean isAnagram(String s, String t) {
    int len1 = s.length();
    int len2 = t.length();
    if (len1 != len2) return false;
    Map<Character, Integer> map = new HashMap<>();
    for (int i = 0; i < len1; i++) {
        map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
    }
    for (int i = 0; i < len2; i++) {
        map.put(t.charAt(i), map.getOrDefault(t.charAt(i), 0) - 1);
    }
    for (int val : map.values()) {
        if (val != 0) return false;
    }
    return true;
}
数组:

只需要记录26个字母的key,所以也可以用数组来做存储出现次数的容器,当出现时,int[i]++

public boolean isAnagram(String s, String t) {
    int[] arr = new int[26];
    for (int i = 0; i < s.length(); i++) {
        arr[s.charAt(i) - 'a']++;
    }
    for (int i = 0; i <t.length(); i++) {
        arr[t.charAt(i) - 'a']--;
    }
    for (int i : arr) {
        if (i != 0) {
            return false;
        }
    }
    return true;
}

两个数组的交集

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章链接:代码随想录

视频链接:学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集_哔哩哔哩_bilibili

解法:

set:

第一个set用于去重,只存放nums1中的数字,第二个resSet用于存放两个数组中交集的数字

 public int[] intersection(int[] nums1, int[] nums2) {
    Set<Integer> set = new HashSet<>();
    Set<Integer> resSet = new HashSet<>();
    for (int i : nums1) {
        set.add(i);
    }
    for (int i : nums2) {
        if (set.contains(i)) {
            resSet.add(i);
        }
    }
    int[] arr = new int[resSet.size()];
    int j = 0;
    for (int i : resSet) {
        arr[j++] = i;
    }
    return arr;
}
数组:

因为题目给的数据集较小,也可以用数组来表示

public int[] intersection(int[] nums1, int[] nums2) {
    int[] hash1 = new int[1002];
    int[] hash2 = new int[1002];
    for(int i : nums1)
        hash1[i]++;
    for(int i : nums2)
        hash2[i]++;
    List<Integer> resList = new ArrayList<>();
    for(int i = 0; i < 1002; i++)
        if(hash1[i] > 0 && hash2[i] > 0)
            resList.add(i);
    int index = 0;
    int res[] = new int[resList.size()];
    for(int i : resList)
        res[index++] = i;
    return res;
}

快乐数

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章链接:代码随想录

解法:

用set记录是否重复出现,如果重复出现则说明进入死循环,直接break结束

public boolean isHappy(int n) {
    Set<Integer> set = new HashSet<>(); 
    while (n > 0) {
        int sum = 0;
        while (n > 0) {
            int res = n % 10;
            sum += res * res;
            n /= 10;
        }
        n = sum;
        if (set.contains(sum)) {
            break;
        } else {
            set.add(sum);
        }
    }
    return n == 1;
}

两数之和

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章链接:代码随想录

视频链接:梦开始的地方,Leetcode:1.两数之和,学透哈希表,map使用有技巧!_哔哩哔哩_bilibili

解法:

map的key存值,value存下标,循环过程中边检验边存,如果没有对应的数字就存入map,如果有就计数

public int[] twoSum(int[] nums, int target) {
    int[] arr = new int[2];
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        int res = target - nums[i];
        if (map.containsKey(res)){
            arr[1] = i;
            arr[0] = map.get(res);
        }
        map.put(nums[i], i);
    }
    return arr;
}

总结

理解的哈希表的用法,在需要判断一个数字是否在集合中时使用,set去重,map统计个数,在这一次的学习中遇到最大的问题是map和set的api不够熟悉,之后还需要加强锻炼和记忆,今天是第六天,加油!!

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值