哈希表:用来快速判断一个元素是否出现在集合里
哈希表是根据关键码的值而直接进行访问的数据结构。(关键码也就是数组的下标,元素通过计算生成一个标识,此标识就是数组的下标,之后通过数组的下标对元素进行查找。)
哈希碰撞:就是值两个及两个以上的元素通过计算,生成的关键码(下标)一样,这种现象就是哈希碰撞。
解决哈希碰撞的方法:
1.拉链法:将发生冲突的元素存储在链表中,类似于hashMap。(选择合适的数组大小,才不会造成空间浪费)
2.线性探测法:tableSize > dataSize;如遇到第二个下标相同的元素,则在第一个元素后面寻找空位存放。
常见的三种hash数据结构:
1.数组
2.set
3.map
242.有效的字母异位词:https://leetcode.cn/problems/valid-anagram/
使用一个长度为26的数组来记录每个字母出现的次数,数组的下标标识字母该放的位置,字符串s的字母出现一次+1;字符串t的字母出现一次-1;最后判断数组中有没有不为0的,不为0则说明两个字符串并不相等。
public class Solution { public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.isAnagram("anagram","nagaram")); } public boolean isAnagram(String s, String t) { int[] res = new int[26]; char[] sa = s.toCharArray(); char[] tc = t.toCharArray(); for (char c : sa) { res[c - 'a'] += 1; } for (char c : tc) { res[c - 'a'] -= 1; } for (int r : res) { if (r != 0){ return false; } } return true; } }
349.两个数组的交集:https://leetcode.cn/problems/intersection-of-two-arrays/
求并集、交集,就可以使用到set集合,HashSet中不允许出现重复的值
public int[] intersection(int[] nums1, int[] nums2) { if (nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0){ return null; } HashSet<Integer> set1 = new HashSet<>(); HashSet<Integer> set2 = new HashSet<>(); for (int i : nums1) { set1.add(i); } for (int i : nums2) { if (set1.contains(i)){ set2.add(i); //确保元素唯一 } } //set集合转化为数组 int[] res = new int[set2.size()]; int index = 0; for (Integer integer : set2) { res[index++] = integer; } return res; }
202.快乐数:https://leetcode.cn/problems/happy-number/
无限循环说明求和过程中可能会出现重复的数值,应该立即返回false;判断重复值就应该使用set集合。
public boolean isHappy(int n) { HashSet<Integer> set = new HashSet<>(); while (n !=1 && !set.contains(n)){ set.add(n); n = getSum(n); } return n == 1; } public static int getSum(int n){ int sum = 0 ; while (n > 0) { int a = n % 10; sum += a*a; n /= 10; } return sum; }
1.两数之和:https://leetcode.cn/problems/two-sum/
- 使用哈希表:当需要查询一个元素是否重复出现过,首先考虑哈希表
- 使用map:需要返回下标,元素值和下标都可以储存
- map的key和value分别是什么:key存元素值,value存下标
public class Solution { public static void main(String[] args) { Solution solution = new Solution(); int[] ints = solution.twoSum(new int[]{2, 7, 11, 15}, 9); for (int anInt : ints) { System.out.print(anInt+" "); } } public int[] twoSum(int[] nums, int target) { int[] ints = new int[2]; HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { //target-nums[i]的差来判断在map中是否存在,取出下标 int temp = target - nums[i]; if (map.containsKey(temp)){ ints[0] = map.get(temp); ints[1] = i; } map.put(nums[i],i ); } return ints; } }