算法笔记|Day5哈希表基础

☆☆☆☆☆leetcode 242.有效的字母异位词

题目链接:leetcode 242.有效的字母异位词

题目分析

1.数组就是一个简单哈希表,定义一个数组record记录字符串s里字符出现的次数,并分别减去各个字符在字符串t中出现的次数,若record各个元素均为0返回true,否则返回false;
2.时间复杂度O(m+n) ,空间复杂度O(1)。

代码

class Solution {
    public boolean isAnagram(String s, String t) {
        int record[]=new int[26];
        for(int i=0;i<s.length();i++){
            record[s.charAt(i)-'a']++;
        }
        for(int j=0;j<t.length();j++){
            record[t.charAt(j)-'a']--;
        }
        for(int n=0;n<26;n++){
            if(record[n]!=0){
                return false;
            }
        }
        return true;
    }
}

提示:
1.获取string字符串的长度:string.length();
2.获取string字符串指定索引位置的字符:string.charAt(int index);

☆leetcode 49.字母异位词分组(待补充)

题目链接:leetcode 49.字母异位词分组

题目分析

代码


☆leetcode 438.找到字符串中所有字母异位词(待补充)

题目链接:leetcode 438.找到字符串中所有字母异位词

题目分析

代码


☆☆☆☆☆leetcode 349. 两个数组的交集

题目链接:leetcode 349. 两个数组的交集

题目分析

1.采用哈希数组,分别记录两个数组出现的元素,若有重复,将重复元素放到列表resList中,最后遍历列表resList得到所需数组;
2.采用哈希set,先记录第一个数组出现的元素,遍历第二个数组是否存在该元素,若存在放到列表resList中,最后遍历列表resList得到所需数组;
3.时间复杂度O(m+n) ,空间复杂度O(1)。

代码

1.采用哈希数组
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int hash1[]=new int[1001];
        int hash2[]=new int[1001];
        for(int i:nums1){
            hash1[i]=1;
        }
        for(int i:nums2){
            hash2[i]=1;
        }
        List<Integer> resList = new ArrayList<>();
        for(int i=0;i<1001;i++){
            if(hash1[i]==1&&hash2[i]==1){
                resList.add(i);                
            }
        }
        int index=0;
        int[] res = new int[resList.size()];  
        for (int i:resList) {  
            res[index++]=i;
        }
        return res;
    }
}
2.采用哈希set
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1=new HashSet<>();
        Set<Integer> resSet=new HashSet<>();
        for(int i:nums1){
            set1.add(i);
        }
        for(int i:nums2){
            if(set1.contains(i)){
                resSet.add(i);
            }
        }
        int index=0;
        int res[]=new int[resSet.size()];
        for(int i:resSet){
            res[index++]=i;
        }
        return res;
    }
}

提示:
1.在Java中,for(元素变量x:遍历对象obj) 是一种增强的for循环(也称为"for-each"循环),它用于遍历数组或集合(如List、Set等)中的元素,而无需使用传统的索引,这种循环方式使得代码更加简洁易读;
2.List resList = new ArrayList<>(); 这行代码创建了一个可以存储Integer类型元素的ArrayList实例,并将这个实例的引用赋值给了List类型的变量resList。这允许你通过resList变量来执行添加、删除、获取等列表操作;
3.resSet.add(i);通过实例调用add方法,将i添加到列表中;
4.Set resSet=new HashSet<>();创建了一个可以存储不重复整数的集合 resSet【在Java中,Set 是一个接口,它代表了一个不允许有重复元素的集合。Set 接口提供了一系列用于操作集合的方法,比如添加、删除、检查元素是否存在等。不过,Set 接口本身并不提供实现;相反,它必须由具体的类来实现,比如 HashSet、LinkedHashSet 和 TreeSet 等。HashSet 是 Set 接口的一个常用实现,它基于哈希表(HashMap)实现。HashSet 允许存储 null 元素,并且不保证集合的迭代顺序;也就是说,当你遍历 HashSet 时,元素的顺序可能与它们被添加到集合中的顺序不同】;
5.set1.contains(i)用于检查集合set1是否包含指定的元素i;

☆leetcode 350.两个数组的交集II(待补充)

题目链接:leetcode 350.两个数组的交集II

题目分析

代码


☆☆☆☆☆leetcode 202. 快乐数

题目链接:leetcode 202. 快乐数

题目分析

1.采用哈希map,此题中会出现循环,只需将每一次计算后的结果存在集合record中,若结果中有1则不是快乐数,一直处于循环结果没有1则是快乐数;
2.计算每个数各个位数的平方和是一个数学问题,从个位平开始取平方相加,直至首位;
3.时间复杂度为O(logn),空间复杂度为O(logn)。

代码

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> record=new HashSet<>();
        while(n!=1&&!record.contains(n)){
            record.add(n);
            n=getNextNumber(n);
        }
        return n==1;
    }
    private int getNextNumber(int n){
        int res=0;
        while(n>0){
            int temp=n%10;
            res+=temp*temp;
            n/=10;
        }
        return res;
    }
}

☆☆☆☆☆leetcode 1. 两数之和

题目链接:leetcode 1. 两数之和

题目分析

1.采用哈希map,遍历每个元素nums[i]时,要考虑target-nums[i]是否出现过,故需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适;
2.时间复杂度为O(n),空间复杂度为O(n)。

代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int res[]=new int[2];
        Map<Integer,Integer>map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int temp=target-nums[i];
            if(map.containsKey(temp)){
                res[0]=map.get(temp);
                res[1]=i;
                break;
            }
            map.put(nums[i],i);
        }
        return res;
    }
}

提示:
1.Map<Integer,Integer> map = new HashMap<>(); 这行代码在Java中创建了一个名为map的HashMap实例,这个HashMap用于存储键值对(key-value pairs),其中键(key)和值(value)都是Integer类型的【HashMap的特点:不保证映射的顺序。允许一个null键和多个null值,基于哈希表的Map接口实现】;
2.map.containsKey(temp)是一个用于检查实现了Map接口的集合中是否包含指定键(key)的方法调用;
3.map.get(temp)是一个用于从实现了Map接口的集合中获取与指定键(key)相关联的值(value)的方法调用;
4.map.put(nums[i], i)是一个调用实现了Map接口的集合将指定的键(key)与值(value)关联(或更新)到映射中。

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值