力扣热题 100:哈希专题三道题详细解析(JAVA)

文章目录

    • 一、两数之和
      • 1. 题目描述
      • 2. 示例
      • 3. 解题思路
      • 4. 代码实现(Java)
      • 5. 复杂度分析
    • 二、字母异位词分组
      • 1. 题目描述
      • 2. 示例
      • 3. 解题思路
      • 4. 代码实现(Java)
      • 5. 复杂度分析
    • 三、最长连续序列
      • 1. 题目描述
      • 2. 示例
      • 3. 解题思路
      • 4. 代码实现(Java)
      • 5. 复杂度分析

在力扣(LeetCode)平台上,热题 100 是许多开发者提升算法能力的必刷清单。今天,我们就来详细解析热题 100 中与哈希相关的三道题,帮助大家更好地理解解题思路和技巧。

一、两数之和

1. 题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

2. 示例

示例 1:

输入:nums = [2, 7, 11, 15], target = 9

输出:[0, 1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

示例 2:

输入:nums = [3, 2, 4], target = 6

输出:[1, 2]

解释:因为 nums[1] + nums[2] == 6 ,返回 [1, 2]

示例 3:

输入:nums = [3, 3], target = 6

输出:[0, 1]

解释:因为 nums[0] + nums[1] == 6 ,返回 [0, 1]

3. 解题思路

这道题是力扣上的经典入门题,主要考察哈希表的应用。我们可以使用哈希表来存储数组中的元素及其下标,然后遍历数组,对于每个元素,检查 target - nums[i] 是否在哈希表中存在。如果存在,则找到了答案。

4. 代码实现(Java)

import java.util.HashMap;
import java.util.Map;public class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];if (map.containsKey(complement)) {return new int[] { map.get(complement), i };}map.put(nums[i], i);}throw new IllegalArgumentException("No two sum solution");}
}

5. 复杂度分析

  • 时间复杂度 :O(n),其中 n 是数组的长度。我们只需要遍历数组一次,对于每个元素,哈希表的查找和插入操作都是 O(1) 的。
  • 空间复杂度 :O(n),需要使用哈希表存储数组中的元素及其下标。

二、字母异位词分组

1. 题目描述

给你一个字符串数组 strs,将 所有变位词 组合在一起。变位词是指字母相同,但排列不同的字符串。

注意:输出的顺序无关紧要。

2. 示例

示例 1:

输入:strs = ["eat", "tea", "tan", "ate", "nat", "bat"]

输出:[["bat"],["nat","tan"],["ate","eat","tea"]]

解释:

  • “bat” 没有变位词。
  • “nat” 和 “tan” 是变位词。
  • “ate”, “eat” 和 “tea” 是变位词。

示例 2:

输入:strs = [""]

输出:[[""]]

解释:空字符串与自身是变位词。

示例 3:

输入:strs = ["a"]

输出:[["a"]]

解释:单个字符与自身是变位词。

3. 解题思路

这道题主要考察字符串的处理和哈希表的应用。我们可以将每个字符串排序后作为哈希表的键,将变位词作为哈希表的值。具体步骤如下:

  1. 创建一个哈希表,键为排序后的字符串,值为变位词列表。
  2. 遍历字符串数组,对每个字符串进行排序,然后将其添加到哈希表中。
  3. 最后,将哈希表的值(即变位词列表)作为结果返回。

4. 代码实现(Java)

import java.util.*;public class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String str : strs) {char[] chars = str.toCharArray();Arrays.sort(chars);String sortedStr = new String(chars);if (!map.containsKey(sortedStr)) {map.put(sortedStr, new ArrayList<>());}map.get(sortedStr).add(str);}return new ArrayList<>(map.values());}
}

5. 复杂度分析

  • 时间复杂度 :O(n * k log k),其中 n 是字符串数组的长度,k 是字符串的最大长度。对于每个字符串,我们需要进行排序,排序的时间复杂度是 O(k log k)。
  • 空间复杂度 :O(n * k),需要使用哈希表存储排序后的字符串和变位词列表。

三、最长连续序列

1. 题目描述

给定一个未排序的整数数组 nums,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

2. 示例

示例 1:

输入:nums = [100, 4, 200, 1, 3, 2]

输出:4

解释:最长连续序列是 [1, 2, 3, 4],它的长度为 4。

示例 2:

输入:nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1]

输出:9

解释:最长连续序列是 [0, 1, 2, 3, 4, 5, 6, 7, 8],它的长度为 9。

3. 解题思路

这道题主要考察哈希表的应用和连续序列的判断。我们可以使用哈希表来存储数组中的元素及其连续序列的长度。具体步骤如下:

  1. 创建一个哈希表,键为数组中的元素,值为该元素的连续序列长度。
  2. 遍历数组,对于每个元素:
    • 如果该元素不在哈希表中,检查其相邻元素(num - 1num + 1)是否在哈希表中。
    • 如果相邻元素存在,更新当前元素的连续序列长度。
    • 将当前元素及其连续序列长度存储到哈希表中。
  3. 最后,返回哈希表中的最大连续序列长度。

4. 代码实现(Java)

import java.util.HashMap;
import java.util.Map;public class Solution {public int longestConsecutive(int[] nums) {Map<Integer, Integer> map = new HashMap<>();int maxLength = 0;for (int num : nums) {if (!map.containsKey(num)) {int left = map.getOrDefault(num - 1, 0);int right = map.getOrDefault(num + 1, 0);int length = left + right + 1;map.put(num, length);maxLength = Math.max(maxLength, length);if (left > 0) {map.put(num - left, length);}if (right > 0) {map.put(num + right, length);}}}return maxLength;}
}

5. 复杂度分析

  • 时间复杂度 :O(n),其中 n 是数组的长度。我们只需要遍历数组一次,对于每个元素,哈希表的查找和插入操作都是 O(1) 的。
  • 空间复杂度 :O(n),需要使用哈希表存储数组中的元素及其连续序列长度。

以上就是力扣热题 100 中与哈希相关的三道题的详细解析,希望对大家有所帮助。在实际刷题过程中,建议大家多动手实践,理解解题思路的本质,这样才能更好地应对各种算法问题。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23003.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式八股文(五)硬件电路篇

一、名词概念 1. 整流和逆变 &#xff08;1&#xff09;整流&#xff1a;整流是将交流电&#xff08;AC&#xff09;转变为直流电&#xff08;DC&#xff09;。常见的整流电路包括单向整流&#xff08;二极管&#xff09;、桥式整流等。 半波整流&#xff1a;只使用交流电的正…

AI2-THOR环境下实现机器人导航、物体定位与抓取

1. 依赖安装 pip install ai2thor pip install numpy pillow opencv-python2. 验证安装 # 运行测试脚本验证安装 test_thor.py from ai2thor.controller import Controller controller Controller(scene"FloorPlan1") controller.step(action"MoveAhead"…

Nginx(详解以及如何使用)

目录 1. 什么是Nginx&#xff1f; 2. 为什么使用nginx? 3. 安装nginx 3.1?安装nginx的依赖插件 3.2 下载nginx ?3.3?创建一个目录作为nginx的安装路径 ?3.4?解压 ?3.5?进入解压后的目录 3.6?指定nginx的安装路径 ?3.7?编译和安装nginx 3.8 启动nginx ?…

【自动化脚本工具】Hammerspoon (Mac)

目录 1. 介绍Hammerspoon 1. 介绍Hammerspoon This is a tool for powerful automation of OS X. At its core, Hammerspoon is just a bridge between the operating system and a Lua scripting engine. What gives Hammerspoon its power is a set of extensions that expo…

2025 PHP授权系统网站源码

2025 PHP授权系统网站源码 安装教程&#xff1a; PHP7.0以上 先上传源码到服务器&#xff0c;然后再配置伪静态&#xff0c; 访问域名根据操作完成安装&#xff0c; 然后配置伪静态规则。 Ngix伪静态规则&#xff1a; location / { if (!-e $request_filename) { rewrite …

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…

基于SpringBoot的民宿管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

hugging face---transformers包

一、前言 不同于计算机视觉的百花齐放&#xff0c;不同网络适用不同情况&#xff0c;NLP则由Transformer一统天下。transformer是2017年提出的一种基于自注意力机制的神经网络架构&#xff0c;transformers库是hugging face社区创造的一个py库&#xff0c;通过该库可以实现统一…

AI大模型学习(四): LangChain(三)

Langchain构建代理 语言模型本身无法执行动作,他们只能输出文本,代理是使用大型语言模型(LLM)作为推理引擎来确定要执行的操作以及这些操作的输入应该是什么,然后这些操作的结果可以反馈到代理中,代理将决定是否需要更多的操作,或者是否可以结束 例如:我们想要查询现在北京的…

企业知识管理平台重构数字时代知识体系与智能服务网络

内容概要 现代企业知识管理平台的演进呈现出全生命周期管理与智能服务网络构建的双重特征。通过四库体系&#xff08;知识采集库、加工库、应用库、评估库&#xff09;的协同运作&#xff0c;该系统实现了从知识沉淀、结构化处理到价值释放的完整闭环。其中&#xff0c;知识图…

(二)趣学设计模式 之 工厂方法模式!

目录 一、 啥是工厂方法模式&#xff1f;二、 为什么要用工厂方法模式&#xff1f;三、 工厂方法模式怎么实现&#xff1f;四、 工厂方法模式的应用场景五、 工厂方法模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博…

详细介绍嵌入式硬件设计

嵌入式硬件设计详解 一、嵌入式硬件设计核心概念 嵌入式硬件设计是针对特定应用场景&#xff0c;将处理器、存储器、外设接口等电子元件集成到电路板上&#xff0c;实现特定功能的系统开发过程。其核心目标是 高可靠性、低功耗、小体积 和 成本优化。 二、设计流程与关键步骤 …

goredis常见基础命令

基本操作 //删除键 exists,err: rdb.Exists(ctx,"key").Result() if err!nil{panic(err) } if exists>0{err rdb.Del(ctx,"key").Err()if err!nil{panic(err)} }string类型 //设置一个键值对 //0表示没有过期时间 err:rdb.Set(ctx,"key1",…

微服务环境搭建架构介绍(附超清图解源代码)

微服务介绍 系统架构演变 随着互联网的发展&#xff0c;网站应用的规模也在不断的扩大&#xff0c;进而导致系统架构也在不断的进行变化。 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->SOA架构…

Java-01-源码篇-04集合-05-ConcurrentHashMap(1)

1.1 加载因子 加载因子&#xff08;Load Factor&#xff09;是用来决定什么时候需要扩容的一个参数。具体来说&#xff0c;加载因子 当前元素数量 / 桶的数量&#xff0c;当某个桶的元素个数超过了 桶的数量 加载因子 时&#xff0c;就会触发扩容。 我们都知道 ConcurrentHas…

一文详解U盘启动Legacy/UEFI方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理&#xff0c;以及面对一些问题时的解决思路&#xff0c;故对以前的方法进行原理上的解释&#xff0c;主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导&#xff0c;我们可以看一下微pe制作的启动盘&#…

【多线程-第三天-NSOperation的练习-tableView异步下载网络图片-下载操作缓存池 Objective-C语言】

一、下载操作缓存池 1.下面我们来看操作缓存池,我们先演示一下问题,看看为什么要加这么一个操作缓存池,什么是操作缓存池,不用管呢,我们先来看啊,首先有什么问题, 看这个问题之前,我这儿写一个touch,点击屏幕的时候调用, 额,不能点击屏幕啊,因为现在屏幕点不着,我…

Windows 中的启动项如何打开?管理电脑启动程序的三种方法

在日常使用电脑时&#xff0c;我们经常会发现一些应用程序在开机时自动启动&#xff0c;这不仅会拖慢系统的启动速度&#xff0c;还可能占用不必要的系统资源。幸运的是&#xff0c;通过几个简单的步骤&#xff0c;你可以轻松管理这些开机自启的应用程序。接下来&#xff0c;我…

具备智能广告拦截、个性化定制的便捷网页浏览器

软件介绍 今天要给大家介绍一款源自俄罗斯的国民级软件&#xff0c;它来自俄罗斯最大互联网公司之一的 Yandex。这家公司不仅有搜索引擎业务&#xff0c;还打造出诸多热门软件&#xff0c;其中就有我们要讲的这款网页浏览器。它由 Yandex 公司依托 Chromium 开源项目开发&…