代码随想录算法训练营第6天 | 哈希表的应用、复习快慢指针思想
2024年7月8日
内容:哈希表的应用
题242. 有效的字母异位词
字母异位词,简单的思考是用数组或哈希表记录每个字母出现的次数然后用两次循环记录,第一个加1第二个减1,最后如果有不为0的就不是。
更快的题解是先排序,然后直接比较是否相等即可。
题349. 两个数组的交集
用set做。最后用list存起来然后转数组返回即可。
可以用stream直接转:
set1.stream().mapToInt(x -> x).toArray();
题202. 快乐数
普通做法是用set存每次结果,然后看是否有重复;
也可以考虑用双指针更快,快的每次执行两次结果,如果快的等于慢的了,就说明有循环。
有循环的类似题目都可以考虑用双指针思想。
此外还要熟练掌握取整数每个位置的数的代码段:`
class Solution {
public boolean isHappy(int n) {
HashSet<Integer> set1 = new HashSet<>();
int x=0;
while(true){
x = tihuan(n);
if(x==1){
return true;
}else{
if(set1.contains(x)){
return false;
}else{
set1.add(x);
n=x;
continue;
}
}
}
}
public int tihuan(int n){
int sum = 0;
while(n>0){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
}
题1. 两数之和
用哈希表存储每个数组元素值和其对应下标,然后在后面遍历的时候就直接检查有没有target-元素值这个key,如果有就可以迅速返回了,时间复杂度就是O(n)。
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map1 = new HashMap<>();
for(int i=0;i<nums.length;i++){
int a = nums[i];
if(map1.get(target-a)!=null){
return new int[]{i,map1.get(target-a)};
}else{
map1.put(a,i);
continue;
}
}
return null;
}
}