【算法题解答·七】哈希

【算法题解答·七】哈希

接上文【算法方法总结·七】哈希的一些技巧和注意事项


哈希相关题目如下:

349. 两个数组的交集

  • 一个哈希 set1 用来保存数组1的值,一个哈希 resSet 用来保存相交的值
java 复制代码
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> resSet = new HashSet<>();
        for (int i : nums1) { // 遍历数组1
            set1.add(i);
        }
        for (int i : nums2) { // 遍历数组2
            if (set1.contains(i)) { // 数组2中也存在则加入
                resSet.add(i);
            }
        }
        int[] arr = new int[resSet.size()];
        int j = 0;
        for (int i : resSet) {
            arr[j++] = i;
        }
        return arr;
    }
}

1. 两数之和

java 复制代码
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2]; // 返回值
        if (nums == null || nums.length == 0) {
            return res;
        }
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int t = target - nums[i];
            if (map.containsKey(t)) { // 包含关键字 t
                res[1] = i;
                res[0] = map.get(t); // 得到关键字的 value
                break;
            } else {
                map.put(nums[i], i); // 加入 map
            }
        }
        return res;
    }
}

454.四数相加II

计算有多少组满足

  • 首先定义 一个HashMapkeyab两数之和,valueab两数之和出现的次数
  • 遍历大A和大B 数组,统计两个数组元素之和 ,和出现的次数 ,放到map中。
  • 定义int变量count,用来统计 a + b + c + d = 0 出现的次数。
  • 再遍历大C和大D 数组,找到如果 0-(c+d)map中出现过的话,就用countmapkey对应的value也就是出现次数统计出来。
java 复制代码
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int res = 0;
        Map<Integer, Integer> map = new HashMap<>();
        // 遍历 A和B
        for (int i : nums1) {
            for (int j : nums2) {
                int sum = i + j;
                // map.getOrDefault(sum, 0)如果存在sum返回其value,否则返回0
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
        }
        // 遍历 C和D
        for (int i : nums3) {
            for (int j : nums4) {
                res += map.getOrDefault(0 - i - j, 0);
            }
        }
        return res;
    }
}

15. 三数之和

  • 因为 不可包括重复 的三元组,使用 哈希法 ,去重过程 不好处理

  • 使用 双指针法 要比 哈希法 高效一些,而且要求 返回的是数值 的话,就可以使用 双指针法

18. 四数之和

  • 15.三数之和 是同一个思路,多一层 for 循环,

  • 对于 15.三数之和 双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,
    18.四数之和 的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法

49.字母异位词分组

  • 先把 "bac" 转化为 [b,a,c]sort 排序后再转回字符串 "abc",为它的 key
  • 先把 "bca" 转化为 [b,c,a]sort 排序后再转回字符串 "abc",为它的 key
  • 上述两者 key 相同
java 复制代码
// sort 得到 key,相同的 key 加入同一个列表中
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 排序法
        Map<String, List<String>> map = new HashMap<>();
        // 遍历数组中的每个字符串
        for (String str : strs) {
            char[] ss = str.toCharArray(); // 转为字符数组
            Arrays.sort(ss); // 排序得到其 key
            String key = String.valueOf(ss); // 字符数组 -> 字符串
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str); // 结果中加入当前字符串
            map.put(key, list); // 更新 map
        }
        return new ArrayList<List<String>>(map.values());
    }
}

128.最长连续序列

  • 先找到起点 x,如果 x-1 也在 set 中,说明 x 不是起点
  • 找到起点后,循环查看 set 中是否有下一个数
dart 复制代码
// 用 HashSet,查找元素方便,如果x-1也在set里,继续遍历直到没有x-1时,x为起点
class Solution {
    public int longestConsecutive(int[] nums) {
        int ans = 0;
        Set<Integer> st = new HashSet<>();
        // 把数组转换为哈希集合
        for (int num : nums) {
            st.add(num);
        }
        for (int x : st) {
            // 如果 x-1 在集合中,继续
            if (st.contains(x - 1)) {
                continue;
            }
            // x 是起点
            int y = x + 1; // 下一个数
            while (st.contains(y)) {
                y++;
            }
            // 循环结束后,y-1 是最后一个在哈希集合中的数
            ans = Math.max(ans, y - x);
        }
        return ans;
    }
}

算法题解答系列

【算法题解答·一】二分法
【算法题解答·二】双指针法
【算法题解答·三】滑动窗口
【算法题解答·四】字符串操作
【算法题解答·五】链表操作
【算法题解答·六】栈队列堆

【算法题解答·七】哈希

相关推荐
西门吹雪分身8 分钟前
Redis之RedLock算法以及底层原理
数据库·redis·算法
一路向北he31 分钟前
杰理10k3950温度测量
java·数据结构·算法
描绘一抹色37 分钟前
力扣-hot100(最长连续序列 - Hash)
数据结构·算法·leetcode
黄昏ivi1 小时前
事件触发控制与响应驱动控制的定义、种类及区别
人工智能·分布式·学习·算法·机器学习
温文尔雅透你娘1 小时前
摄像头在自动驾驶中的核心应用:感知算法与技术方案深度解析
人工智能·算法·计算机视觉·目标跟踪·自动驾驶
Vacant Seat1 小时前
贪心算法-跳跃游戏
算法·游戏·贪心算法
是小满满满满吗1 小时前
基础贪心算法集合2(10题)
算法·贪心算法
小林熬夜学编程1 小时前
【高阶数据结构】第三弹---图的存储与遍历详解:邻接表构建与邻接矩阵的BFS/DFS实现
c语言·数据结构·c++·算法·深度优先·图论·宽度优先
谢道韫6662 小时前
37-串联所有单词的子串
开发语言·算法·c#
爱编程的小新☆2 小时前
2025年第十六届蓝桥杯省赛JavaB组真题回顾
算法·职场和发展·蓝桥杯