Set哈希集合

哈希集是集合的实现之一,它是一种存储不重复值的数据结构。使用set可以快速进行查重。在大小不确定时,使用数组可能会无法计算,而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费,此时可以考虑使用HashSet,但是直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。

模板

  1. /*
  2. * Template for using hash set to find duplicates.
  3. */
  4. boolean findDuplicates(List<Type>& keys) {
  5. // Replace Type with actual type of your key
  6. Set<Type> hashset = new HashSet<>();
  7. for (Type key : keys) {
  8. if (hashset.contains(key)) {
  9. return true;
  10. }
  11. hashset.insert(key);
  12. }
  13. return false;
  14. }

两个数的交集

题目描述:

力扣链接🔗

Set哈希集合 - 图1

题目分析:

要注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

Set哈希集合 - 图2

代码:

  1. class Solution {
  2. public int[] intersection(int[] nums1, int[] nums2) {
  3. // 判断长度为空
  4. if (nums1.length == 0 || nums2.length == 0) {
  5. return new int[]{};
  6. }
  7. // 此题去重且不考虑顺序,可以使用hashset
  8. Set<Integer> set = new HashSet<>();
  9. Set<Integer> resSet = new HashSet<>();
  10. // 将nums2放入set
  11. for (int i = 0; i < nums2.length; i++) {
  12. set.add(nums2[i]);
  13. }
  14. for (int i = 0; i < nums1.length; i++) {
  15. // 将存在的元素放入resSet中
  16. if (set.contains(nums1[i])) {
  17. resSet.add(nums1[i]);
  18. }
  19. }
  20. int index = 0;
  21. int[] ints = new int[resSet.size()];
  22. // 转化为int数组
  23. for (Integer value : resSet) {
  24. ints[index++] = value;
  25. }
  26. return ints;
  27. }
  28. }

快乐数

题目描述

力扣链接🔗

Set哈希集合 - 图3

题目分析:

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

代码:

  1. class Solution {
  2. /**
  3. * 使用hashset记录
  4. * @param n
  5. * @return
  6. */
  7. public boolean isHappy(int n) {
  8. Set<Integer> set = new HashSet<>();
  9. int sum = getNextNumber(n);
  10. while (sum != 1) {
  11. sum = getNextNumber(sum);
  12. // 如果分解后平方还是以前存在过的数,即是一直循环,不满足快乐数
  13. if (set.contains(sum)) {
  14. return false;
  15. }
  16. set.add(sum);
  17. }
  18. return true;
  19. }
  20. /**
  21. * 分解整数的方法
  22. * @param n
  23. * @return
  24. */
  25. private int getNextNumber(int n) {
  26. int temp, res = 0;
  27. while (n > 0) {
  28. temp = n % 10;
  29. n = n / 10;
  30. res += temp * temp;
  31. }
  32. return res;
  33. }
  34. }

其他题目

只出现依次的数字

(力扣链接🔗

存在重复元素

(力扣链接🔗

环形链表Ⅱ

羽雀链接🔗