哈希理论基础:
1.那么哈希表解决问题,一般哈希表都是用来快速判断一个元素是否出现集合里。
2.哈希碰撞:多个数据都映射到了索引下标 1 的位置。(一般哈希碰撞有两种解决方法, 拉链法和线性探测法)
Leetcode 242 力扣
解法:哈希数组(数据范围较小使用)计数,相同消掉,统计数组中是否存在不为0情况
public static boolean isAnagram(String s, String t) { int[] records = new int[26];// s 和 t 仅包含小写字母,可以由数组值取26个英文字母 for (int i = 0; i < s.length(); i++) { records[s.charAt(i) - 'a']++; // s中字符加到数组计数 } for (int i = 0; i < t.length(); i++) { records[t.charAt(i) - 'a']--; // t中字符从数组减去 } for (int count: records) { if (count != 0){ // 数组中存在不为0元素,说明有多余字符 return false; } } return true; }
Leetcote 349 力扣
解法:哈希set统计不重复元素
public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set1 = new HashSet<>(); // 统计nums1中不重复元素 Set<Integer> set2 = new HashSet<>(); // 统计在nums1中出现并且也在nums2中出现的不重复元素 for (int num1:nums1) { set1.add(num1); } for (int num2:nums2) { if (set1.contains(num2)){ set2.add(num2); } } int[] res = new int[set2.size()]; int index =0; for (int num:set2) { res[index++] = num; } return res; }
Leetcode 202 力扣
自己理解题目还是理解不出来。如何想到set存储sum后重复就返回false?
解法一:递归+哈希set计数,重复返回false
public boolean isHappy1(int n) { return testNum(n, 0, new HashSet<Integer>()); } private boolean testNum(int n, int sum, HashSet<Integer> set) { String s_sum = String.valueOf(n); char[] chars = s_sum.toCharArray(); for (Character c : chars) { // 个位、十位按字符串取 int temp = Integer.parseInt(String.valueOf(c)); sum += temp * temp; } boolean add = set.add(sum); if (!add) { return false; } if (sum == 1) { return true; } return testNum(sum, 0, set); }
解法二:哈希set计数,重复返回false
public boolean isHappy(int n) { Set<Integer> set = new HashSet<>(); while (n != 1 && !set.contains(n)) { // n不等于1且set不包含n set.add(n); n = getTwoNums(n); } return n == 1; } private int getTwoNums(int n) { int res = 0; while (n > 0) { int temp = n % 10; // 取个位计算 res += temp * temp; n = n / 10; // 取十位计算 } return res; }
Leetcode 1 力扣
解法一:暴力枚举
public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i +1; j < nums.length; j++) { if (nums[i] + nums[j] == target){ return new int[]{i,j}; } } } return new int[0]; }
解法二:哈希表都是用来快速判断一个元素是否出现集合里
public int[] twoSum1(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int temp = target - nums[i]; if (map.containsKey(temp)) { return new int[]{map.get(temp),i}; } map.put(nums[i], i); // key 放数组值,value放索引下标 } return new int[0]; }
拓展题求步长,类似域两数之和。
Leetcode 2418 力扣
解法:哈希存名字和体重然后排序定义数组赋值
public static String[] sortPeople(String[] names, int[] heights) { int n = names.length; HashMap<Integer, String> hs = new HashMap<>(); for(int i = 0; i < n; i++){ hs.put(heights[i],names[i]); } Arrays.sort(heights); // 排序 for(int i = n-1; i >= 0; i--){ // 升序后倒序遍历 names[i] = hs.get(heights[n-i-1]); // 这里得注意赋值取值从0开始 } return names; }