LeetCode 刷题总结——hash篇
本文用于记录在刷题过程中遇到的好的代码段,以便复盘。
valid-anagram
排序法
import java.util.Arrays;
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length()!=t.length()){
return false;
}
char[] s1 = s.toCharArray();
char[] t1 = t.toCharArray();
Arrays.sort(s1);
Arrays.sort(t1);
return Arrays.equals(s1,t1);
}
}
哈希表
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length()!=t.length()) return false;
int[] counter = new int[26];
for(int i=0;i<s.length();i++){
counter[s.charAt(i)-'a']++;
counter[t.charAt(i)-'a']--;
}
for(int count : counter) if(count!=0) return false;
return true;
}
}
哈希表
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length()!=t.length()) return false;
int[] counter = new int[26];
for(int i=0;i<s.length();i++) counter[s.charAt(i)-'a']++;
for(int i=0;i<t.length();i++){
counter[t.charAt(i)-'a']--;
if(counter[t.charAt(i)-'a']<0) return false;
}
return true;
}
}
group-anagrams
排序法
import java.util.Collections;
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs.length==0) return null;
Map<String,List<String>> map = new HashMap<>();
for(String str : strs) {
char cur[] = str.toCharArray();
Arrays.sort(cur);
String key=String.valueOf(cur); //将字符数组转化为字符串
//创建一个ArrayList对象,存储String
if(!map.containsKey(key)) map.put(key,new ArrayList<>());
map.get(key).add(str); //ArrayList.add
}
//创建一个ArrayList对象,存储list<String>
return new ArrayList<>(map.values());
}
}
数组法
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs.length==0) return null;
Map<String, List<String>> map = new HashMap<>();
for(String str : strs) {
char[] counter = new char[26];
//赋值为int[] 则需要StringBuilder
for(int i=0;i<str.length();i++) counter[str.charAt(i)-'a']++;
String key = String.valueOf(counter);
if(!map.containsKey(key)) map.put(key,new ArrayList<>());
map.get(key).add(str);
}
return new ArrayList<>(map.values());
}
}
two-sum
两次遍历hash
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++) {
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
int v=target-nums[i];
//这个判断很重要
if(map.containsKey(v)&&map.get(v)!=i) return new int[] {i,map.get(v)};
}
return new int[2];
}
}
一次遍历hash(效率最高)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i])) return new int[] {map.get(target-nums[i]),i};
map.put(nums[i],i);
}
return new int[2];
}
}