哈希表 hash table
- 一般用来快速判断一个元素是否出现集合里
- 查找元素时间复杂度
O(1)
哈希函数 hash function
哈希碰撞 hash collision
- 线性探测法
- 拉链法
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法
leetcode242
题目链接
经典题
思路:
- 开辟一个长度26的数组
flag[]
flag[s.charAt(i) - 'a']
class Solution {
public boolean isAnagram(String s, String t) {
int[] flag = new int[26];
for (int i = 0; i < s.length(); ++i)
++flag[s.charAt(i) - 'a'];
for (int i = 0; i < t.length(); ++i)
--flag[t.charAt(i) - 'a'];
for (int i = 0; i < 26; ++i) {
if (flag[i] != 0)
return false;
}
return true;
}
}
leetcode 349
tips:
使用数组做hash的题目——题目都限制了数值的大小
本题未规定数值范围,因此不行
- 用
set
解决
java中集合使用
- 函数:
add()
:添加元素contains()
:是否包含某个元素remove()
:删除元素size()
:返回元素数isEmpty()
:是否为空clear()
:清空
java.util.TreeSet
多的函数*——支持二分查找*
ceiling(key)
:返回大于等于key的最小元素,不存在则返回null
floor(key)
:返回小于等于key的最大元素,不存在则返回null
代码
import java.util.HashSet;
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0)
return new int[0];
Set<Integer> s1 = new HashSet<Integer>();
Set<Integer> s2 = new HashSet<>();
for (int x: nums1)
s1.add(x);
for (int x : nums2) {
if (s1.contains(x)) //find whether nums2[i] in s1
s2.add(x);
}
int[] res = new int[s2.size()];
int i = 0;
for (int x : s2) {
res[i++] = x;
}
return res;
}
}
leetcode 202
题目链接
看起来像是数学问题,but 其实是一个集合问题
import java.util.HashSet;
class Solution {
public int getNum(int n) {
int num = 0;
while (n > 0) {
int t = n % 10; //末位数
num += t * t;
n = n / 10;
}
return num;
}
public boolean isHappy(int n) {
Set<Integer> res = new HashSet<>();
while (!res.contains(n) && n != 1) {
res.add(n);
n = getNum(n); //find next number
}
if (n == 1)
return true;
else
return false;
}
}
leetcode 1
重点!! 想到使用hash table Map 解决
java中Map使用
-
实现:
java.util.HashMap<K, V>
:哈希表——无序java.util.TreeMap<K, V>
:平衡树——有序
-
函数:
put(key, value)
:添加关键字和其对应的值get(key)
:返回关键字对应的值containsKey(key)
:是否包含关键字remove(key)
:删除关键字size()
:返回元素数isEmpty()
:是否为空clear()
:清空entrySet()
:获取Map中的所有对象的集合Map.Entry<K, V>
:Map中的对象类型getKey()
:获取关键字getValue()
:获取值
代码
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if (nums.length == 0)
return res;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; ++i) {
int t = target - nums[i];
if(map.containsKey(t)){ //Map <key, value>
res[1] = i;
res[0] = map.get(t);
break;
}
map.put(nums[i], i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return res;
}
}