当前位置: 首页 > news >正文

leetcode3 哈希

有限空间映射无限空间

有序化快速查询         解决映射查询

核心应用: 提速      空间和时间

001  两数之和

哈希代替遍历

一般来说处理Java数据量需要和10^9进行比较

  • 提示:

  • 2 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9

java整型占用四个字节 范围为:  -2^31-2^31

class Solution {// public int[] twoSum(int[] nums, int target) {//         Map<Integer, Integer> map = new HashMap<>();//         for (int i = 0; i < nums.length; i++){//             if(map.containsKey(target - nums[i])){//                 return new int[]{i,map.get(target - nums[i])};//             }//             map.put(nums[i],i);//         }//     return new int[]{};// }public int[] twoSum(int[] nums, int target) {HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int choose = nums[i];int diff = target - choose;if(map.containsKey(diff)){return new int[]{map.get(diff),i};}else{map.put(choose,i);}}return null;}
}

049  字母异位词

借助对数据重新标准化来定制哈希从而聚合数据

第一种方法:把它们都排序,发现“身份证”一样。

核心思想:找到一个“身份证”

如果把两个词的字母按字母表顺序重新排列,得到的结果是相同的,那么它们就是字母异位词。

  • "eat" -> 排序后 -> "aet"
  • "tea" -> 排序后 -> "aet"
  • "ate" -> 排序后 -> "aet"

看,它们排序后的结果都是 "aet"。所以,我们可以把这个排序后的字符串 "aet" 当作这组词共同的“身份证”或“标签”。

算法的思路就是:

  1. 遍历输入的每一个单词。
  2. 为每个单词生成一个“身份证”(即排序后的字符串)。
  3. 把拥有相同“身份证”的单词都放到同一个组里。
    public List<List<String>> groupAnagrams(String[] strs) {HashMap<String, List<String>> map = new HashMap<>();for (String key : strs) {final char[] chars = key.toCharArray();Arrays.sort(chars);String sortKey = new String(chars);if(map.containsKey(sortKey)){map.get(sortKey).add(key);}else {List<String> s = new ArrayList<>();s.add(key);map.put(sortKey,s);}}return new ArrayList<>(map.values());}

第二种方法:不排序,而是数一数每个单词里 a-z 字母的个数。

通过分解目标结构的规则来实现分步查找

新的核心思想:用字母计数当“身份证”

1. Word 类:制作和比较“身份证”

这个类是这段代码的精髓。它把一个普通的 String 包装成了一个带有“字母计数身份证”的对象。

2. Solution 类:主分组逻辑

这部分和上一个版本的代码结构几乎一模一样,只是把用作“身份证”的 String 换成了我们自己定义的 Word 对象。

插入一个注意:equals() 和 hashCode() 要一起重写:hashCode() 负责快速缩小范围(定位书架),equals() 负责在小范围内精确查找(逐本核对)。两者必须协同工作,标准必须统一,否则整个系统就会崩溃。

equals() 方法:告诉 Java 如何判断两个 Word 对象是否“相等”
我们认为,只要它们的“身份证”(counts 数组)完全一样,它们就相等

hashCode() 方法:为 Word 对象生成一个“哈希码”(一个整数)
Java 的 HashMap 用这个哈希码来快速定位对象。

规则:如果两个对象 equals() 为 true,那么它们的 hashCode() 必须相同。
我们直接用“身份证”(counts 数组)来生成哈希码,完美符合规则。

  public List<List<String>> groupAnagrams(String[] strs) {HashMap<Word, List<String>> map = new HashMap<>();for (String key : strs) {Word word = new Word(key);if(map.containsKey(word)){map.get(word).add(key);}else {List<String> s = new ArrayList<>();s.add(key);map.put(word,s);}}return new ArrayList<>(map.values());}//“身份证”本体:一个长度为26的整数数组,记录了字符串中每个字母出现的次数class Word {int[] counts;Word(String s) {final char[] chars = s.toCharArray();counts = new int[26];for (char c : chars) {int index = c-'a';counts[index]++;}}// --- 以下两个方法是让 Word 对象能作为 HashMap 的 Key 的关键 ---public boolean equals(Object o) {return Arrays.equals(counts, ((Word) o).counts);}public int hashCode() {return Arrays.hashCode(counts);}}

128.最长连续序列

   public int longestConsecutive(int[] nums) {HashSet<Integer> set = new HashSet<>();for (int num : nums) {set.add(num);}int res = 0;int count = 0;for (int n : set) {if (!set.contains(n - 1)) {count = 1;int current = n;while (set.contains(current + 1)) {current++;count++;}res = Math.max(res, count);}}return res;}

哈希核心目的

  空间换时间为代码提速

要观察数据规模的提示

http://www.dtcms.com/a/393788.html

相关文章:

  • Spring AI 整合OpenAI 聊天、做图
  • 阿里Motionshop人物角色替换成3D虚拟形象
  • C语言自学--字符函数和字符串函数
  • spring-boot--邮箱验证码发送--spring-boot-starter-mail
  • 3ds Max 2026安装教程(附安装包)3ds Max 2026下载详细安装图文教程
  • Genie 2:Google DeepMind 推出的基础世界模型,单张图生成 1分钟可玩 3D 世界
  • LeetCode 104. 二叉树的最大深度
  • 欧拉角描述相机的运动
  • Unity2D-Spriteshape
  • 打工人日报#20250921
  • Coolmuster Android Assistant:Windows系统下的Android设备管理专家
  • Android 的多进程机制 (Android Multi-Process Model)
  • 2025研究生数学建模通用神经网络处理器下的核内调度问题草案
  • Spring Boot 4 新特性详解:5大核心更新助力企业级开发
  • 计算机网络经典问题透视:网络利用率和网络时延之间,究竟存在着怎样一种“爱恨交织”的关系?我们梦寐以求的100%网络利用率,在现实世界中真的能够实现吗
  • requests 和 lxml 库的xpath实现
  • 前端梳理体系从常问问题去完善-工程篇(webpack,vite)
  • Go语言在K8s中的核心优势
  • 旅游门票预订系统支持微信小程序+H5
  • Requests 网络请求:Python API 交互与数据获取
  • 基于Dify实现简历自动筛选过滤
  • PHP中常见数组操作函数
  • 避坑指南:鸿蒙(harmony next)APP获取公钥和证书指纹的方法
  • Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进中的深度应用(414)
  • 【场景题】如何解决大文件上传问题
  • 云原生复杂多变的环境中的安全防护方案
  • Python10-逻辑回归-决策树
  • 如何生成一个不会重复随机数?
  • 【精品资料鉴赏】155页WORD大型制造企业MES制造执行系统建设方案
  • 定时计划任务