LeetCode 热题 100 题解(一):哈希部分
《LeetCode热题 100》
经过了两个多月,终于刷完了代码随想录的题目,现在准备开始挑战热题一百了,接下来我会将自己的题解以博客的形式同步发到力扣和 c 站,希望在接下来的征程中与大家共勉!
题组一:哈希
题集链接:LeetCode 热题 100
01.两数之和(No.1)
题目链接
<1> 题目
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 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]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
<2> 题解
本题中给出一个数组和一个 target,问数组中哪两个数字可以组合成 target;并且题目中明确的指出,一定会有且仅有一组解。
本题将选择限制在 两个数字,并且只有一种情况,那如果遍历到一个数字 i,其实只需要查询它的前面中存不存在 target - i 就可以了,比如说如下的情况:
如果说当前遍历到 7,从开头到 7 是否遍历过 2 即可;但是这样每次都要从头开始遍历,时间开销比较大。
那能不能通过一个映射关系将每个数据是否出现和出现的位置存储下来,然后通过查询这个映射关系,来快速得知数组中是不是存在这个元素了呢?
比如上面的情况,当遍历到 2,先查询前面是否遍历到过 target - 2,如果没有就将 2 存储下来,并且与其出现的位置做一个映射;此时当遍历到 7 的时候,就可以通过查询这个映射来得知 2 是否出现过和其最后一次出现的下标是什么了。
for (int i = 0; i < nums.length; i++) {int temp = target - nums[i];if (map.containsKey(temp)) {// 查看前面是否遍历过 target - nums[i]res[0] = i;res[1] = map.get(temp);break;}map.put(nums[i], i); // 如果没有就将其存储下来,之后使用}
其实到这里这道题就结束了,写出完整的代码:
<3> 代码
class Solution {public int[] twoSum(int[] nums, int target) {// key 为数字,value 为下标int[] res = new int[2];for (int i = 0; i < nums.length; i++) {int temp = target - nums[i];if (map.containsKey(temp)) {res[0] = i;res[1] = map.get(temp);break;}map.put(nums[i], i);}return res;}
}
02. 字母异位词分组(No. 49)
题目链接
<1> 题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
<2> 题解
本题给出一组字符串,让我们将所有的 字母异位词 进行归类,放到一组中。
所谓字母异位词就是能够通过调换位置来变成相同的单词的一组词语,比如 “cat” “act” 和 “tac” 就是一组字母异位词。它们的特点就是 拥有的字母相同,同时 拥有的每个字母出现的次数也是相同的;判断两个单词是否是字母异位词其实也就是判断这个特点。
但显然 拥有字母相同、拥有的每个字母出现的次数相同 这两个特点直接写成代码是相当冗余的,所以这时候就考虑到有没有一种方式能将拥有这两个特点的单词映射为同一个数据结构,那对于本题,其实就可以映射为一个数组,下标表示它是 “a” 到 “z” 中的哪一个(题目中规定了只会出现小写字母),数组中存储的是这个单词出现的次数,比如 abbbcc 经过映射之后就是这样的:
用 ASCII 码可以将字母映射为数字,利用这个式子:
字母 - 'a'
写出代码就是这样的:
public int[] getHash(String s) {int[] hash = new int[26];for (int i = 0; i < s.length(); i++) {hash[s.charAt(i) - 'a']++;}return hash}
这样每种单词就被映射为一个唯一的数组,如果它们是字母异位词,那它们的这个 hash 数组就一定是相同的。
那本题就可以先去遍历,每次遍历到一个字符串,就将其转化为这种哈希数组,然后判断这个哈希数组在之前是否出现过,如果出现过 就将其归为一类。
思路到这里其实就比较清晰了,但是代码实现上还是有些困难,首先遇到的第一个问题,我如何将哈希数组和字符串存在一起呢?
相当简单,用 Map 嘛!但是 Map 不能将非包装类作为键值对,首先要解决的就是将哈希数组变为可以放到 Map 类中的类型。
最容易想出来的就是将字符串拼接起来,所以自然的写出了如下的代码:
StringBuilder res = new StringBuilder();for (int i : hash) {res.append(i);}return res.toString();
但是此时,虽然我们的哈希数组是唯一的,但是通过这种方式转化成的字符串可不一定是唯一的啊,比如说这两个字符串:“bdddddddddd”,“bbbbbbbbbbc”,将它们拼接然后写出来就会出现如下的情况:
01010000000…
01010000000…
啊,相同的,那怎么办呢?
其实解决方式也很简单,将它们隔开就可以了,变成这样
0|1|0|10|000000…
0|10|1|0|000000…
在每次 append
之前再 append
上一个 | 就可以实现了。
此时就终于解决了将每一个字符串映射为同一种数据类型,可以使用 Map 将哈希数组和字符串映射起来了;此时去遍历字符串,获取映射好的哈希数组字符串,然后检查 Map 中是否含有这个哈希字符串,如果含有就将其存放到 **值(Value)**中的 List 中,如果不存在,就构造一个新的链表存入这个元素然后将其放到 Map 中。
if(map.containsKey(hash)) {// 存在的情况List<String> strings = map.get(hash);strings.add(s);} else {// 不存在的情况List<String> list = new ArrayList<>();list.add(s);map.put(hash, list);}
完成!写出最终代码
<3> 代码
class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map = new HashMap<>();for (String s : strs) {String hash = getHash(s);if(map.containsKey(hash)) {List<String> strings = map.get(hash);strings.add(s);} else {List<String> list = new ArrayList<>();list.add(s);map.put(hash, list);}}return new ArrayList<>(map.values());}public String getHash(String s) {int[] hash = new int[26];for (int i = 0; i < s.length(); i++) {hash[s.charAt(i) - 'a']++;}StringBuilder res = new StringBuilder();for (int i : hash) {res.append("|");res.append(i);}return res.toString();}
}
03. 最长连续子序列(No. 128)
题目链接
<1> 题目
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 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 <= nums.length <= 105
-109 <= nums[i] <= 109
<2> 题解
(1)哈希解法
本题其实类似 两数之和 的思想,比如说我手中有一个 3,那此时要寻找的就是 2 是否出现过,并且以 2 作为结尾的子序列的长度为多少,如果没有出现过,那 3 就只能作为子序列的第一个元素。
所以此时就需要一个数据结构,能够同时存储某个元素是否出现,且能存储以它为结尾的子序列的长度,那就是双列集合 Map 了,将 KEY 设定为数字,将 VALUE 设定为以它为结尾的子序列的长度;此时为了让在遍历 3 之前,得知 2 是否遍历过,且要知道长度,那此时就必须对数组进行 排序处理。
对每个数字分为两种处理逻辑:
- 如果 num - 1 出现过,那此时以它为结尾的长度就是 map.get(num - 1) + 1
- 如果没有出现过,那此时以它为结尾的长度就是 1
以上两种情况都要将其存放到 map 中。
if (map.containsKey(num - 1)) {int l = map.get(num - 1);map.put(num, l + 1);res = Math.max(res, l + 1);
} else {map.put(num, 1);
}
每次加一的时候获取一次值,因为不确定最终的结果是以谁为结尾,后面附上完整的代码。
(2)动态规划解法
其实本题我首先想出来的就是动态规划的解法,接下来分析一下解题的思路
1. 状态
将本题的状态考虑出来解答就比较简单了,就是以 num 为结尾的子序列的最大长度。
思考一下这个状态能否转移呢?
以 nums 为结尾的子序列的长度其实就是通过以 nums - 1 为结尾的子序列的长度推出的,所以为了让 dp 数组中的元素紧凑,此时也需要先对数组进行 排序。
2. dp 数组
dp[i]
就定义为以 i 结尾,最长的子序列的长度。
3. 状态转移方程
回顾一下 dp 数组,如果对递推公式存在疑问先回去看dp数组的定义
分为三种情况,因为 nums 已经排好序了,所以 nums[i] 的上一个可能
- 等于 nums[i]
- 小于 nums[i] - 1
- 等于 nums[i] - 1
对于第一种情况,那 dp[i] = dp[i - 1]
对于第二种情况,就为 dp[i] = 1
最后一种情况就是恰好等于的情况,也就是 dp[i] = dp[i - 1] + 1;
4. 初始化
本题依赖于 dp[i - 1] 所以一开始要将 dp[0] 初始化成 1
写出完整的代码
<3>代码
哈希解法
class Solution {public int longestConsecutive(int[] nums) {if (nums.length == 0) return 0;Map<Integer, Integer> map = new HashMap<>(); // 存储出现过的数字和长度int res = 1;Arrays.sort(nums); // 排序for (int num : nums) {int temp = 0;if (map.containsKey(num - 1)) {// 如果出现过int l = map.get(num - 1);map.put(num, l + 1);res = Math.max(res, l + 1);} else {// 未出现过的话map.put(num, 1);}}return res;}
}
动态规划解法
class Solution {public int longestConsecutive(int[] nums) {if (nums.length == 0) return 0;Arrays.sort(nums); //先对数组进行排序int[] dp = new int[nums.length];dp[0] = 1;int res = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1]) {// 相等的情况dp[i] = dp[i - 1];continue;}if (nums[i] == nums[i - 1] + 1) {dp[i] = dp[i - 1] + 1;} else {dp[i] = 1;}res = Math.max(res, dp[i]);}return res;}
}
相关文章:
LeetCode 热题 100 题解(一):哈希部分
《LeetCode热题 100》 经过了两个多月,终于刷完了代码随想录的题目,现在准备开始挑战热题一百了,接下来我会将自己的题解以博客的形式同步发到力扣和 c 站,希望在接下来的征程中与大家共勉! 题组一:哈希 题…...
C语言 | qsort()函数使用
目录: 1.qsort介绍 2.使⽤qsort函数 排序 整型数据 3.使⽤qsort函数 排序 结构体数据 4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数, 它可以对指定数组(包括字符串,二维数组&#x…...
继承的特点 | java
/*Java中继承的特点:A:Java只支持单继承,不支持多继承。 B:Java支持多层继承(继承体系),间接继承 */class Father(){} class Mother(){}class son extends Father(){} // 正确 class son2 extends Father , Mother {} // 不正确 1. Java只支持单继承…...
6、jenkins项目构建类型-项目类型介绍
文章目录 一、自由风格项目1、拉取代码2、演示改动代码后的持续集成二、Maven项目构建三、Pipeline流水线项目构建(☆☆☆)1、Pipeline简介(1)概念(2)使用Pipeline有以下好处(3)如何创建Jenkins Pipeline呢?2、安装Pipeline插件3、Pipeline语法快速入门(1)Declarati…...
指针函数的应用——找出哪些学生有不及格的科目
下面的代码实现了以下功能: 定义了一个函数 getFailStudent,它接收一个指向整数数组的指针,并遍历该数组,查找是否存在不及格的成绩。如果找到了不及格的成绩,就返回指向不及格学生所在行的指针;否则返回 N…...
【微服务】Gateway
文章目录 1.基本介绍官方文档:https://springdoc.cn/spring-cloud-gateway/#gateway-starter1.引出网关2.使用网关服务架构图3.Gateway网络拓扑图(背下来)4.Gateway特性5.Gateway核心组件1.基本介绍2.断言3.过滤 6.Gateway工作机制 2.搭建Gat…...
王道C语言督学营OJ课后习题(课时14)
#include <stdio.h> #include <stdlib.h>typedef char BiElemType; typedef struct BiTNode{BiElemType c;//c 就是书籍上的 datastruct BiTNode *lchild;struct BiTNode *rchild; }BiTNode,*BiTree;//tag 结构体是辅助队列使用的 typedef struct tag{BiTree p;//树…...
Filter、Listener、AJAX
Filter 概念:Filter 表示过滤器,是JavaWeb三大组件(Servlet、Filter、 Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感…...
FastAPI+React全栈开发04 FastAPI概述
Chapter01 Web Development and the FARM Stack 04 Introducing FastAPI FastAPIReact全栈开发04 FastAPI概述 Now we will look at a brief introducion to the Python REST-API framework of choice - FastAPI. Additionally, we will go over a high-level overview of t…...
基于单片机的二维码LCD显示控制设计
**单片机设计介绍,基于单片机的二维码LCD显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的二维码LCD显示控制设计是一个集硬件、软件与通信于一体的综合性项目。此设计的主要目标是实现单片机…...
Ubuntu20.04下PCL安装,查看,卸载等操作
Ubuntu20.04下PCL安装,查看,卸载等操作 项目来源 https://github.com/PointCloudLibrary/pclhttps://pointclouds.org/documentation/modules.htmlhttps://pcl.readthedocs.io/projects/tutorials/en/master/ 点云学习: https://github.c…...
Android TargetSdkVersion 30 安装失败 resources.arsc 需要对齐且不压缩。
公司项目,之前targetSDKVersion一直是29,近期小米平台上架强制要求升到30,但是这个版本在android12上安装失败,我用adb命令安装,报错如下图 adb: failed to install c: Program Files (x86)(0A_knight\MorkSpace \Home…...
c++20中的jthread再谈
一、介绍 在前面的C20新功能中,简单的介绍过相关的std::jthread的应用。当时觉得它虽然比std::thread方便一些,但也没有多大的优势。可在后面的不断的学习中,发现std::jthread的使用上确实有优秀之处,相对于传统的线程编程&#…...
Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! FastGPT是非常实用并且相当厉害的个人知识库AI项目,项目是非常…...
Rust 实战练习 - 7. FFI, 库, ABI, libc
FFI FFI(Foreign Function Interface)是这样一种机制:用一种编程语言写的程序能调用另一种编程语言写的函数(routines)。 调用约定,类型表示和名称修饰这三者的统称,即是众所周知的应用二进制…...
vue实现把Ox格式颜色值转换成rgb渐变颜色值(开箱即用)
图示: 核心代码: //将0x格式的颜色转换为Hex格式,并计算插值返回rgb颜色 Vue.prototype.$convertToHex function (colorCode1, colorCode2, amount) {// 确保输入是字符串,并检查是否以0x开头let newCode1 let newCode2 if (t…...
Unity 窗口化设置
在Unity中要实现窗口化,具体设置如下: 在编辑器中,选择File -> Build Settings。在Player Settings中,找到Resolution and Presentation部分。取消勾选"Fullscreen Mode",并选择"Windowed"。设…...
Android14之深入理解sp模板类(二百零二)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
.NET core 5.0 及以上的Windows Service开发
首先,一定要和.NET Framework区分开, 详细请看微软的2023年的最新官方文档 Create Windows Service using BackgroundService - .NET | Microsoft Learn Create a Windows Service installer - .NET | Microsoft Learn 同样微软的官方微博给出了开发…...
Nginx配置文件解释
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,…...
R语言赋值符号<-、=、->、<<-、->>的使用与区别
R语言的赋值符号有<-、、->、<<-、->>六种,它们的使用与区别如下: <-’:最常用的赋值符号。它将右侧表达式的值赋给左侧的变量,像一个向左的箭头。例如,x …...
ffmpeg重点之时间戳,PTS、DTS、time_base
PTS和DTS和时间基time_base 首先我们知道PTS是一帧音频或视频显示的时间,DTS是解码时间戳 既然是时间,PST和DTS的单位是什么呢?秒还是毫秒,抑或是纳秒? 先说结论—都不是 先引入FFmpeg中时间基的概念,也就是time_bas…...
OpenGL 实现“人像背景虚化“效果
手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…...
基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起,互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域,传统的…...
AUTOSAR关于内存栈的分层及描述
首先关于关于内存栈的分层:如下图所示,Nvm靠近RTE的;MemIf居中,EA和FEE被包含其中。 其次关于这三层的缩写:可以看到EEPROM的模拟和EEPROM的抽象层。 我们可以看到 大概的数据流: 和大致的结构分层作用&am…...
windows powershell连接linux 上传下载文件
连接:输入下面命令,回车 输入密码进入linux系统 ssh root192.168.188.128退出linux logoutwindow上传文件到Linux服务器 把桌面的123.txt 上传到linux home文件夹下 scp C:\Users\pzx\Desktop\123.txt root192.168.188.128:/homelinux下载文件到windo…...
Vue生命周期,从听说到深入理解(全面分析)
每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶…...
故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)
效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…...
iOS library not found for -lMBProgressHUD
0x00 前因 一开始是使用 CocoaPods 管理 MBProgressHUD,后来直接导入 MBProgressHUD 源码,就出现了这个错误:library not found for -lMBProgressHUD 0x01 后果 在 Xcode 工程目录中找到文件夹:Frameworks 看看里面是否有个红色…...
Paper Digest|基于在线聚类的自监督自蒸馏序列推荐模型
论文标题: Leave No One Behind: Online Self-Supervised Self-Distillation for Sequential Recommendation 作者姓名: 韦绍玮、吴郑伟、李欣、吴沁桐、张志强、周俊、顾立宏、顾进杰 组织单位: 蚂蚁集团 录用会议: WWW 2024 …...
广州越秀区天气预报15天查询/乐陵seo优化
在前面随笔《基于Metronic的Bootstrap开发框架--工作流模块功能介绍》和《基于Metronic的Bootstrap开发框架--工作流模块功能介绍(2)》中介绍了Bootstrap开发框架的工作模块功能,前面文章也提及,通过代码生成工具直接生成对应的Cr…...
网站改版设计要多久/百度搜索关键词技巧
留学监理服务网东北大学计算机工程(本硕连读) - Computer Engineering基本信息东 北 大 学 - Northeastern 工程学院 - 电子与计算机工程所属学校 所在院系University 系计算机工程(本硕连读) -专业名称 学历层次 本科Computer Engineering工程与技术 计算机与信息科学授予学位…...
宜春网站制作/网络推广赚钱平台有哪些
工控机安装 openvino2021.4 需要安装python 就安装了python3.8.8 但是直接报错 安装不上去 在网上找了各种方法,最后安装了KB2533623 之后可以安装python了 下载地址 链接: https://pan.baidu.com/s/15KpcRN2w5v7xQtaFm7JlMw?pwdaxs6 提取码: axs6 或者 KB25…...
可信赖的深圳网站建设/2021小学生新闻摘抄
/*** 选择排序的思想:* 每次从待排序列中找到最小的元素,* 然后将其放到待排的序列的最左边,直到所有元素有序** 选择排序改进了冒泡排序,将交换次数从O(N^2)减少到O(N)* 不过比较次数还是O(N)*/package al;public class SelectSo…...
网站建设项目甘特图/最新新闻热点事件2022
回首忆惘然与我的其他答案完全相反,即使使用多字节字符,此后续功能也可能是安全的。// replace any non-ascii character with its hex code.function escape($value) { $return ; for($i 0; $i < strlen($value); $i) { $char $valu…...
如何做网站访百度联盟/网站快速排名互点软件
在Stata/SE 16.0中,您可以使用以下命令将dta格式数据存储为Excel: export excel using filename.xlsx, replace其中,filename.xlsx是要存储的Excel文件的名称,replace选项指示如果该文件已经存在,则将其替换。 请注意&…...