首页 > 编程语言 >算法笔记|Day5哈希表基础

算法笔记|Day5哈希表基础

时间:2024-07-23 16:53:59浏览次数:23  
标签:题目 数组 int res Day5 算法 哈希 new leetcode

算法笔记|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)关联(或更新)到映射中。

标签:题目,数组,int,res,Day5,算法,哈希,new,leetcode
From: https://blog.csdn.net/m0_57632621/article/details/140634842

相关文章

  • 算法:求最后一个单词的长度
    题目要求 解答1:暴力解决classSolution(object):deflengthOfLastWord(self,s):""":types:str:rtype:int"""input_list=[iforiins.split("")ifi!=""]......
  • Johnson 全源最短路算法以及 Primal-Dual 原始对偶算法
    Johnson全源最短路算法引入:多源最短路问题,设点数为\(n\)边数为\(m\)。我们有如下方案:floyd,时间复杂度\(O(n^3)\),适合任意图。Bellman-ford(SPFA),时间复杂度\(O(n^2m)\),适合任意图。Dijkstra,时间复杂度\(O(nm\logm)\),适合非负权图。综上分析,我们发现:Dijkstra的时间......
  • 代码随想录算法训练营第20天 | 二叉搜索树中级
    2024年7月22日题235.二叉搜索树的最近公共祖先普通解法还是和普通的祖先一样求即可,再依据搜索树特性进行剪枝即可加速。importjava.util.*;classSolution{Vector<TreeNode>vec1;Vector<TreeNode>vec2;intflag1=0;intflag2=0;publicT......
  • 简单架构:采集库dll、检测算法dll、项目程序exe,框架库dll
    一般项目exe通过调用各种封装的dll来完成工作。视觉项目exe调用采集库dll、检测算法dll就可以了,有一定积累后凝练出框架库dll(日志、队列、线程池等必不可少的部分封装)它们之间通过“接口函数+数据”来配合。针对采集dll:IGrabber.h里放接口函数,如开始采集、停止采集、set参数......
  • 【论文解读】大模型算法发展
    一、简要介绍 论文研究了自深度学习出现以来,预训练语言模型的算法的改进速度。使用Wikitext和PennTreebank上超过200个语言模型评估的数据集(2012-2023年),论文发现达到设定性能阈值所需的计算大约每8个月减半一次,95%置信区间约为5到14个月,大大快于摩尔定律下的硬......
  • 代码随想录算法训练营第18天 | 二叉搜索树进阶
    2024年7月20日题530.二叉搜索树的最小绝对差使用递归获取中序遍历,然后遍历一遍vector即可得到结果。importjava.util.*;classSolution{Vector<Integer>vec;publicintgetMinimumDifference(TreeNoderoot){//首先得到中序遍历的结果vec......
  • # 代码随想录算法训练营第38天 | 01背包问题:1049.最后一块石头的重量II(最多能装多少)、
    1049.最后一块石头的重量IIhttps://leetcode.cn/problems/last-stone-weight-ii/代码随想录https://programmercarl.com/1049.最后一块石头的重量II.html#算法公开课494.目标和https://leetcode.cn/problems/target-sum/description/代码随想录https://programmercarl.com......
  • 目标检测算法
    目标检测算法是计算机视觉领域中的一项核心技术,旨在从图像或视频中识别和定位一个或多个特定对象实例。这些算法不仅需要确定对象的位置(如通过边界框),还需要识别对象的类别(如人、汽车、狗等)。随着深度学习技术的快速发展,基于深度神经网络的目标检测算法已成为主流,并在各种应......
  • 离线分治算法:cdq 分治
    \(\texttt{0x00}\):前置芝士归并排序;树状数组;重载运算符(这个大概都会吧)。\(\texttt{0x01}\):介绍cdq分治是一种离线分治算法,可用来处理以下几种问题:解决和点对有关的问题。1D动态规划的优化与转移。通过CDQ分治,将一些动态问题转化为静态问题。它们的本质都是通过一......
  • Python-深度学习算法实用指南-全-
    Python深度学习算法实用指南(全)原文:zh.annas-archive.org/md5/844a6ce45a119d3197c33a6b5db2d7b1译者:飞龙协议:CCBY-NC-SA4.0前言深度学习是人工智能领域最受欢迎的领域之一,允许你开发复杂程度各异的多层模型。本书介绍了从基础到高级的流行深度学习算法,并展示了如何使用......