Leetcode刷题Day5休息 & Day6----------哈希表
1. 哈希表理论基础
数组、Set、Map
如果数据量小------------数组
如果数据量大------------Set
如果有Key、value------------Map
- 文章讲解:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
2. 有效的字母异位词 (242)
- 题目链接:https://leetcode.cn/problems/valid-anagram/
- 文章讲解: https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html
- 视频讲解:https://www.bilibili.com/video/BV1YG411p7BA/?vd_source=1fb98c05c7fbfd06713f014ea5079d5b
思路:
- 分别统计两个字符串每个字母出现的次数,看是否相同。
- 数据量小---------使用数组
class Solution {
public boolean isAnagram(String s, String t) {
int[] ints=new int[26];
for(int i=0;i<s.length();i++){
ints[s.charAt(i)-'a']++;
}
for(int i=0;i<t.length();i++){
ints[t.charAt(i)-'a']--;
}
for(int i=0;i<ints.length;i++){
if(ints[i]!=0) return false;
}
return true;
}
}
3. 两个数组的交集 (349)
- 题目链接: https://leetcode.cn/problems/intersection-of-two-arrays/
- 文章讲解/视频讲解:https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html
思路:
- 用把第一个数组的数据加到Set1里 在Set1里查是否有数组2的元素,把有的数据在放到Set2里(避免重复) 将Set2转成数组
- set2.stream().mapToInt(x -> x).toArray();
Javadoc链接:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set=new HashSet<>();
Set<Integer> set2=new HashSet<>();
int[] ints=new int[Math.max(nums2.length,nums1.length)];
for(int i=0;i<nums1.length;i++){
set.add(nums1[i]);
}
for(int i=0;i<nums2.length;i++){
if(set.contains(nums2[i])){
set2.add(nums2[i]);
}
}
return set2.stream().mapToInt(x -> x).toArray();
}
}
4. 快乐数 (202)
- 题目链接: https://leetcode.cn/problems/happy-number/
- 文章讲解:https://programmercarl.com/0202.%E5%BF%AB%E4%B9%90%E6%95%B0.html
思路:
- 循环说明了要用Set,看是否存在
- while循环终止的条件:n==1 或者n成为了循环数,所以在循环外判断是否等于1来判断是否是快乐数。因为存在一种成为循环数了但不是1的情况,输入2:循环数是4。例如:
- 数字运算:有多位数的可能,例如:100,所以判断是否>0,先得余,再得商
class Solution {
public boolean isHappy(int n) {
Set<Integer> set=new HashSet<>();
while(n!=1&&!set.contains(n)){
set.add(n);
n=getNum(n);
}
return n==1;
}
public int getNum(int n){
int res=0;
while(n>0){
res+=(n%10)*(n%10);
n=n/10;
}
System.out.println(res);
return res;
}
}
5. 两数之和 (1)
- 题目链接: https://leetcode.cn/problems/two-sum/
- 文章讲解/视频讲解:https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
int num=target-nums[i];
if(!map.containsKey(num)){
map.put(nums[i],i);
}else
return new int[]{i,map.get(num)};
}
return new int[0];
}
}