哈希表简介
- 是什么
存储数据的容器 - 有啥用?
"快速"查找某个元素 - 什么时候用哈希表
频繁地查找某个数(有序用二分) - 怎么用哈希表
一. 两数之和
两数之和
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hash = new HashMap<>();
for(int i= 0; i < nums.length; i++){
int x = target - nums[i];
if(hash.containsKey(x)){
return new int[]{i, hash.get(x)};
}
hash.put(nums[i], i);
}
return null;
}
}
二. 判断是否互为字符重排
判断是否互为字符重排
class Solution {
public boolean CheckPermutation(String s1, String s2) {
if(s1.length() != s2.length()){
return false;
}
int[] hash = new int[26];
for(int i = 0; i < s1.length(); i++){
hash[s1.charAt(i) - 'a']++;
}
for(int i = 0; i < s2.length(); i++){
hash[s2.charAt(i) - 'a']--;
if(hash[s2.charAt(i) - 'a'] < 0){
return false;
}
}
return true;
}
}
三. 存在重复元素
存在重复元素
class Solution {
public boolean containsDuplicate(int[] nums) {
Set<Integer> hash = new HashSet<>();
for(int x : nums){
if(hash.contains(x)) return true;
hash.add(x);
}
return false;
}
}
四. 存在重复元素II
存在重复元素II
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer, Integer> hash = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (hash.containsKey(nums[i]) && i - hash.get(nums[i]) <= k) {
return true;
}
hash.put(nums[i], i);
}
return false;
}
}
五. 字母异位词分组
字母异位词分组
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> hash = new HashMap<>();
for(String x : strs){
char[] tmp = x.toCharArray();
Arrays.sort(tmp);
String key = new String(tmp);
if(!hash.containsKey(key)){
hash.put(key, new ArrayList());
}
hash.get(key).add(x);
}
return new ArrayList(hash.values());
}
}
```\