文章目录

一、哈希表

在记录的存储位置和它的关键字之间建立一个确定的对应关系H,以函数H(key)作为关键字为key的记录在表中的位置,这个对应关系H称为哈希(Hash)函数(又称散列函数),按这个思想建立的表为哈希表(HashTable)。

用哈希表解决一个经典的leetcode问题_数据结构

  • 哈希表的时间复杂度:在常规情况下查找、插入、删除都是O(1)
  • 用哈希表解决一个经典的leetcode问题_数组_02

二、LeetCode 1. 两数之和

用哈希表解决一个经典的leetcode问题_数组_03

  • 分析一下题目:
  1. 题意:给定数组与目标值,需要从数组中找出两个数,这两数相加之和等于目标值;如果在数组中找到这两个数,返回其所在的下标即可。
  2. 思路: 根据题意,首先想到是的要遍历此数组,其次我们要找一个合理的数据结构来存放已经遍历过的数字,且在遍历到当前数字时要快速判断出此数据结构中是否已存放了目标值减去当前数字的数值(即已遍历过的数字+当前数字=目标值),如果存在代表找到了这两个数,返回下标即可。
  3. 解题: 根据思路,我们可以选择哈希表这个数据结构(查找,插入时间复杂度都为O(1)),哈希表将依次遍历的当前数值做为key与对应的数组下标做为value存入,且在遍历下一个数值时,以目标值target减去下一个数值做为key,判断整个哈希表中是否存在这个key,如果存在返回两个下标值,如果不存在,继续遍历。

三、代码

public int[] twoSum(int[] nums, int target) {
// 引入哈希表数据结构
HashMap<Integer, Integer> hashMap = new HashMap<>();
// 遍历整个数组
for (int i = 0; i < nums.length; i++) {
// 目标值target减去下一个数值做为key,判断整个哈希表中是否存在这个key
if (hashMap.containsKey(target - nums[i]) && hashMap.get(target - nums[i])>= 0) {
// 存在,返回前后两个下标即可
return new int[]{hashMap.get(target - nums[i],i};
} else {
// 不存在,以数值为key,下标为value存入哈希表
hashMap.put(nums[i], i);
}
}
return new int[0];
}
  • 提交结果
  • 用哈希表解决一个经典的leetcode问题_数组_04