前言
一、哈希表简介
定义:
也叫做散列表,是根据关键字和值(Key Value)直接进行访问的数据结构,即通过一个关键字Key和一个映射函数Hash计算出对应的值Value,然后把键值对映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数,用于存放记录的数组叫做哈希表。
即存储数据的表。通过哈希函数使得数据和存储位置之间建立一一对应的映射关系。在查找时,通过哈希函数可以直接找到该元素。
作用:
在查找时,通过哈希函数可以直接找到该元素。即快速的查找到某个元素;
使用场景:
当我们需要频繁的查找某一个数的时候。
怎么使用哈希表?
(1)通过容器使用(哈希表)(2)通过数组使用,用数组简易模拟哈希表;
图示示例:数组模拟
二、两数之和
2.1 题目描述
描述:
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
示例1:
实例2:
示例3:
2.2 题目解析
2.2.1 算法原理
本题我们可以采用哈希表的方式解决这道题;
原因:本题中我们要求返回数组下标,还需要通过判断数组中元素的值来求和;
直接就契合了哈希表的存储方式:hash<index,n[index]>;
所以本题我们想到了通过hash表的方式来进行解决;
解题思路:
(1)首先如果我们可以把数组中元素的值和数组下标绑定起来一起存入到哈希表这个容器当中,然后在hash表中查找每一个元素的target - num[i];就能快速找到目标和的下标;
这里有一个小技巧,我们可以不用将元素全部放入到哈希表之后,再来二次遍历(因为要处理元素相同的情况)。而是在将元素放入到哈希表中的「同时」,直接来检查表中是否已经存在当前元素所对应的目标元素(即 target - nums[i])。 如果它存在,那我们已经找到了对应解,并立即将其返回。无需将元素全部放入哈希表中,提高效率。
说明:
因为哈希表中查找元素的时间复杂度是 O(1) ,遍历⼀遍数组的时间复杂度为 O(N) ,因此可以 将时间复杂度降到 O(N) 。
解题步骤:
步骤一:
先定义一个哈希表容器,把数组中元素的值和数组下标绑定起来一起存入到哈希表这个容器当中,然后对数组进行遍历操作;
步骤二:
遍历操作的过程中,将元素放入到哈希表中的「同时」,直接来检查表中是否已经存在当前元素所对应的目标元素(即 target - nums[i])步骤三:
如果它存在,那我们已经找到了对应解,并立即将其返回。
如果遍历完数组都不存在,说明没有对应的解,为了照顾编译器,随便返回-1,-1;
2.2.2 代码编写
代码解析:
三、判定是否互为字符重排
3.1 题目描述
描述:
给定两个由小写字母组成的字符串s1
和s2
,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
说明:
0 <= len(s1) <= 100
0 <= len(s2) <= 100
示例1:
示例2:
示例3: