【练习】哈希表的使用

news2024/12/24 19:54:03

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:算法(Java)
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

1.哈希表简介 

2.两数之和

题目描述

题解

代码实现

2.面试题.判定是否互为字符重排

题目描述 

题解 

代码实现 

3.存在重复元素

题目描述 

题解 

代码实现 

4.存在重复元素 II

题目描述 

题解 

代码实现 

5.字母异位词分组

题目描述 

题解 

代码实现 


1.哈希表简介 

  • 哈希表是什么?

存储数据的容器。

  • 有什么用 ?

快速查找某个元素,时间复杂度可以达到 O(1)。 

  • 什么时候用哈希表? 

当出现频繁查找某一个数的场景时。 

  • 怎么用哈希表? 

1.容器(哈希表 HashMap)

2.用数组模拟简易的哈希表。如:字符串中的字符,数据范围很小的时候。 

2.两数之和

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

题解

 解法一:暴力枚举.  O(n^2)

  1. 先固定其中一个数.
  2.  依次与该数之前的数相加.

解法二: 使用哈希表来优化.  O(n)

  • 可以事先将「数组内的元素」和「下标」绑定在⼀起存⼊「哈希表」中,然后直接在哈希表中查找每⼀个元素的 target - nums[i] ,就能快速的找到⽬标和的下标.
  • 这⾥有⼀个⼩技巧,可以不⽤将元素全部放⼊到哈希表之后,再来⼆次遍历;⽽是在将元素放⼊到哈希表中的同时,直接来检查表中是否已经存在当前元素所对应的⽬标元素(即 target - nums[i] )。                                                                                                                              

代码实现

    public int[] twoSum(int[] nums, int target) {
        //<value, i>
        Map<Integer, Integer> hash = new HashMap<>();

        for(int i = 0; i < nums.length; i++) {
            int ret = target - nums[i];
            if(hash.containsKey(ret)) {
                return new int[]{i, hash.get(ret)};
            }
            hash.put(nums[i], i);
        }
        return new int[]{-1, -1};
    }

2.面试题.判定是否互为字符重排

题目描述 

题解 

解法:使用哈希表. 

算法思路:
  1. 当两个字符串的⻓度不相等的时候,是不可能构成互相重排的,直接返回 false
  2. 如果两个字符串能够构成互相重排,那么每个字符串中各个字符出现的次数⼀定是相同 的。因此,我们可以分别统计出这两个字符串中各个字符出现的次数,然后逐个⽐较是否相等即可。这样的话,我们就可以选择「哈希表」来统计字符串中字符出现的次数。

代码实现 

    public boolean CheckPermutation(String s1, String s2) {
        if(s1.length() != s2.length()) {
            return false;
        }
        int[] hash = new int[26];
        //先把第一个字符串信息统计到哈希表中
        for(int i = 0; i < s1.length(); i++) {
            hash[s1.charAt(i) - 'a']++;
        }

        for(int j = 0; j < s2.length(); j++) {
            hash[s2.charAt(j) - 'a']--;
            if(hash[s2.charAt(j) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }

3.存在重复元素

题目描述 

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:

输入:nums = [1,2,3,1]
输出:true

示例 2:

输入:nums = [1,2,3,4]
输出:false

题解 

算法思路:(和两数之和的逻辑一样)

  • 仅需在遍历数组的过程中,检查当前元素「是否在之前已经出现过」即可。  
  • 可以利⽤哈希表,仅需存储数「组内的元素」。在遍历数组的时候,⼀边检查哈希表中是否
    已经出现过当前元素,⼀边将元素加⼊到 哈希表中。

代码实现 

    public boolean containsDuplicate(int[] nums) {
        Set<Integer> hash = new HashSet<>();

        for(int i = 0; i < nums.length; i++) {
            if(hash.contains(nums[i])) {
                return true;
            }
            hash.add(nums[i]);
        }
        return false;
    }

4.存在重复元素 II

题目描述 

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [1,2,3,1], k = 3
输出:true

示例 3:

输入:nums = [1,2,3,1,2,3], k = 2
输出:false

题解 

算法思路:
解决该问题需要我们快速定位到两个信息:
  • 两个相同的元素;
  • 这两个相同元素的下标。
因此,我们可以使⽤「哈希表」,令数组内的元素做 key 值,该元素所对应的下标做 val 值,将
「数组元素」和「下标」绑定在⼀起,存⼊到「哈希表」中。

代码实现 

    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer, Integer> hash = new HashMap<>();

        for(int i = 0; i < nums.length; i++) {
            
            if(hash.containsKey(nums[i])) {
                int ret = hash.get(nums[i]);
                if(i - ret <= k) {
                    return true;
                }
            }
            hash.put(nums[i], i);
        }
        return false;

    }

5.字母异位词分组

题目描述 

题解 

算法思路:
互为字⺟异位词的单词有⼀个特点:将它们 排序 之后,两个单词应该是 完全相同 的。 所以,我们可以利⽤这个特性,将单词按照字典序排序,如果排序后的单词相同的话,就划分到同⼀ 组中。
利⽤语⾔提供的「容器」的强⼤的功能就能实现这两点:
  • 将排序后的字符串( string )当做哈希表的 key 值;
  • 将字⺟异位词数组( string[] )当成 val 值。

代码实现 

    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> hash = new HashMap<>();

        for(String s : strs) {
            char[] tmp = s.toCharArray();
            //排序
            Arrays.sort(tmp);
            String key = new String(tmp);
            //哈希表中不存在
            if(!hash.containsKey(key)) {
                hash.put(key, new ArrayList());
            }
            //存在
            hash.get(key).add(s);
        }
        //提取结果
        return new ArrayList(hash.values());
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;122.买卖股票的最佳时机 II贪心算法&#xff1a;动态规划 题目二&#xff1a;55.跳跃游戏解题思路&#xff1a; 题目三&#xff1a; 45.跳跃游戏 II解题思路方法一方法二 题…

在Centos中的mysql的备份与恢复

1.物理备份 冷备份&#xff1a;关闭数据库时进行热备份&#xff1a;数据库运行时进行&#xff0c;依赖于数据库日志文件温备份&#xff1a;数据库不可写入但可读的状态下进行 2.逻辑备份 对数据库的表或者对象进行备份 3.备份策略 完全备份&#xff1a;每次都备份完整的数…

每日OJ_牛客_Rational Arithmetic(英文题模拟有理数运算)

目录 牛客_Rational Arithmetic&#xff08;英文题模拟有理数运算&#xff09; 解析代码 牛客_Rational Arithmetic&#xff08;英文题模拟有理数运算&#xff09; Rational Arithmetic (20)__牛客网 解析代码 本题看上去不难&#xff0c;但是存在几个问题&#xff1a; 除…

【C++】汇编分析

传参 有的是用寄存器传参&#xff0c;有的用push传参 我在MSVC编译测出来的是PUSH传参&#xff08;debug模式&#xff09;&#xff0c;具体过程如下 long func(long a, long b, long c, long d,long e, long f, long g, long h) {long sum;sum (a b c d e f g h);ret…

《机器学习》文本数据分析之关键词提取、TF-IDF、项目实现 <上>

目录 一、如何进行关键词提取 1、关键词提取步骤 1&#xff09;数据收集 2&#xff09;数据准备 3&#xff09;模型建立 4&#xff09;模型结果统计 5&#xff09;TF-IDF分析 2、什么是语料库 3、如何进行中文分词 1&#xff09;导包 2&#xff09;导入分词库 3&#xff09…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(SVM分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;SVM分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择&#xff08;WOA&#xff09;结合SVM分类器的详细原理和流程原理流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化…

js | XMLHttpRequest

是什么&#xff1f; 和serve交互数据的对象&#xff1b;能够达到页面部分刷新的效果&#xff0c;也就是获取数据之后&#xff0c;不会使得整个页面都刷新&#xff1b;虽然名字是XML&#xff0c;但不限于XML数据。 怎么用&#xff1f; function reqListener() {console.log(thi…

理解数据库系统的内部结构

数据库系统在我们的数字世界中扮演着关键角色。本文将介绍数据库系统的内部结构&#xff0c;帮助初学者了解其基本概念。 数据库系统的三级模式 数据库系统内部采用三级模式二级映像结构&#xff0c;包括外模式、模式和内模式。这种结构确保了数据的逻辑独立性和物理独立性。…

全能型AI vs 专业型AI:未来是草莓味的AI吗?

草莓&#xff1a;全能型AI的新宠儿&#xff1f; 根据最近的消息&#xff0c;OpenAI的“草莓”模型据说是一个全能型AI&#xff0c;无论是解数学题还是搞定主观营销策略&#xff0c;它都能轻松驾驭。这个AI不仅仅是能解决问题&#xff0c;更是能够跨越多个领域&#xff0c;展现出…

C++学习/复习补充记录 --- 图论(深搜,广搜)

数据结构与算法 | 深搜&#xff08;DFS&#xff09;与广搜&#xff08;BFS&#xff09;_深搜广搜算法-CSDN博客 深度优先搜索理论基础 深搜和广搜的区别&#xff1a; &#xff08;通俗版&#xff09; dfs是可一个方向去搜&#xff0c;不到黄河不回头&#xff0c;直到遇到绝境了…

消费电子钛时代到来!天工股份抢占发展高地,业绩爆发式增长、前景广阔

消费电子“钛时代”正加速到来。 27日凌晨&#xff0c;苹果正式定档iPhone 16系列新品的发布会日期。据悉&#xff0c;本次iPhone 16 Pro系列将全系标配钛金属中框&#xff0c;继续沿用并升级此前在iPhone 15 Pro系列上应用的钛金属材质。 回看去年9月秋季新品发布会&#xf…

三秒学会--百度网盘下载提速10倍的小tip

开启优化速率 从2mb-->20mb 纵享新丝滑~

PHP安装扩展包时忽略依赖强制安装

正常安装时会检查依赖包&#xff0c;比如是否安装了reids扩展&#xff0c;是否安装了gd库等&#xff0c;卖到依赖包安装失败。 如下提示&#xff1a; 这样会导致你的包安装不上。 使用下面命令&#xff0c;强制安装&#xff0c;如下&#xff1a; 加上 --ignore-platform-req…

常见概念 -- dBm, mW,dB之间的关系

dBm与mW dBm&#xff08;毫瓦分贝&#xff09;与mW&#xff08;毫瓦&#xff09;都是光功率的单位。 两者之间的换算关系&#xff1a;dBm10xlgP。其中P为功率&#xff0c;单位为mW。 如&#xff1a;1mW可换算为0dBm。 dBm与dB dBm为光功率的单位&#xff0c;d…

GraphPad Prism下载安装教程怎样中文汉化

GraphPad Prism下载安装教程怎样中文汉化&#xff1a; GraphPad Prism 是一款集生物统计、曲线拟合和科技绘图于一体的软件&#xff0c;主要用于医学和生物科学领域的数据分析和绘图&#xff0c;具有高效、简便、多功能和高质量的特点&#xff0c;被广泛应用于科研、教育和业界…

告别繁琐,拥抱简单!用户好评如潮的录屏软件

不论你是有游戏过程录制的需求&#xff0c;还是教学片段录制的需求肯定都需要电脑屏幕录制工具吧。除了小巧便捷的ocam录屏之外还有不少类似工具可供我们选择。这次我就给你介绍几款我用过的录屏工具吧。 1.福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这款录屏…

智慧猪场实训中心解决方案

一、引言 随着科技的飞速发展&#xff0c;传统养猪业正经历着前所未有的变革。为了提高养猪效率、降低生产成本并保障猪只健康&#xff0c;智慧养猪场的概念应运而生。唯众特此推出《智慧猪场实训中心解决方案》&#xff0c;旨在通过先进的技术与管理手段&#xff0c;为养猪业培…

MQ专题:延迟消息的通用方案

一、主要内容 本文将实现一个MQ延迟消息的通用方案。 方案不依赖于MQ中间件&#xff0c;依靠MySQL和DelayQueue解决&#xff0c;不管大家用的是什么MQ&#xff0c;具体是RocketMQ、RabbitMQ还是kafka&#xff0c;本文这个方案你都可以拿去直接使用&#xff0c;可以轻松实现任…

【安规电容】

安规电容&#xff08;Safety Capacitors&#xff09;是一种专门设计用于电气设备中的电容器&#xff0c;主要用于确保电气安全&#xff0c;特别是用于交流电路中的滤波、降噪以及跨接隔离等功能。它们必须符合特定的安全标准&#xff0c;以确保电气设备在各种运行条件下都能保持…

MySQL:简述数据库的主从复制

MySQL主从复制是指数据可以从一个MySQL数据库主节点复制到一个或多个从节点。 MySQL默认采用异步复制方式&#xff0c;这样从节点不用一直访问主节点来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0c;从节点可以复制主节点中的所有数据库或者特定的数据…