【优选算法系列】【专题十哈希表】第一节.哈希表简介(1. 两数之和and面试题 01.02. 判定是否互为字符重排)


前言

一、哈希表简介

定义:

也叫做散列表,是根据关键字和值(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:


3.2 题目解析

3.2.1 算法原理


3.2.2 代码编写


总结

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值