哈希题目总结

以下列举了可以用哈希方法(包括但不限于用HashMap和HashSet)的题目,实质上是把东西丢给这些数据结构去维护。请注意有些题目中用哈希是最优解,有些题目中不是最优解,可以自行探索其时间复杂度和空间复杂度的区别,思考优化的方法(位运算或者原地排序等)。x数之和/差的专题多半都可以用哈希方法。

1 重复元素

1.1、查询/判断是否有重复元素

存在重复元素:给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。

 数组中重复的数字:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> set = new HashSet<>();for (int num : nums) {if (set.contains(num)) {return true;}set.add(num);}return false;}
}

1.2、判断是否存在重复元素(距离不超过K)

存在重复元素 II:给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引i和j,使得 nums[i] = nums[j],并且i和j的差的绝对值至多为k。

思路:哈希map保存 <num, index>

  • num 重复出现时,更新 index,保证和后面的工作指针更靠近;
class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer, Integer> map = new HashMap<>();//保证了 num再次出现时, index肯定是更靠近工作指针的for (int i=0; i<nums.length; i++) {if (map.containsKey(nums[i])) {if (Math.abs(i - map.get(nums[i])) <= k) {return true;}}map.put(nums[i], i);}return false;}
}

1.3、是否存在重复元素(距离&value差满足一定条件)

存在重复元素 III:在整数数组nums中,是否存在两个下标i 和j,使得nums[i]和nums[j] 的差的绝对值小于等于t,且满足i和j的差的绝对值也小于等于ķ。如果存在则返回true,不存在返回false。

思路:桶

  • 定义 Map
    • key=桶编号;
    • value=具体的num值;
    • map中的数据在 abs(i - j)<=indexDiff 范围内,一旦超过就 remove超出的键值对;
  • 对每个元素 num 计算其对应的桶编号;这题的值域范围限制是[-10^9, 10^9],总数量没有超过有符号整型的正数范围,所以完全可以用更简单的平移法来生成id,避免更多的推导。
  • 检测桶i、i-1、i+1 在map中是否存在,如果存在则自动满足 indexDiff条件,下面判断是否满足valueDiff条件即可
    • 桶 i 内已经存在元素 x,那么 abs(x-num) 肯定满足 valueDiff,返回true;
    • 桶 i-1、i+1 需要额外判断是否满足 abs(x-num)
  • 其他桶就不需要检测了,abs(x-num) 肯定不满足 valueDiff;
  • 如果没找到,就把 num 和桶编号放入到map中;
  • 最后删除不满足 indexDiff的map数据;
class Solution {public boolean containsNearbyAlmostDuplicate(int[] nums, int indexDiff, int valueDiff) {int n = nums.length;// key=桶编号, value=具体的num值, map中的数据在 abs(i - j)<=indexDiff 范围内Map<Long, Long> map = new HashMap<>();//桶大小long bucketSize = (long)valueDiff + 1;//只要map有值,那么肯定满足 indexDiff的条件,只需要判断 valueDiff的条件即可for (int i=0; i<n; i++) {//计算元素对应的桶的编号long id = getID(nums[i], bucketSize);if (map.containsKey(id)) {return true;}//检查相邻的左边桶, 需要满足 abs(nums[i]-nums[j]) <= valueDiffif (map.containsKey(id-1) && Math.abs(nums[i] - map.get(id-1)) < bucketSize) {return true;}//检查相邻的右边桶, 需要满足 abs(nums[i]-nums[j]) <= valueDiffif (map.containsKey(id+1)&& Math.abs(nums[i] - map.get(id+1)) < bucketSize) {return true;}//注意这里肯定不会发生覆盖,因为一旦覆盖就说明两个元素同属一个桶,直接返回true了map.put(id, (long)nums[i]);//保证map中的数据在 abs(i - j)<=indexDiff 范围内if (i >= indexDiff) {map.remove(getID(nums[i-indexDiff], bucketSize));}}return false;}//计算元素所属的桶编号private long getID(long x, long bucketSize) {//统一正负数return (x + 1000000000) / bucketSize;}
}

1.4、数组是否存在重复元素(常数空间复杂度&不可修改数组)

寻找重复数:给定一个包含n+1个整数的数组nums,其数字都在1到n之间(包括1和n),可知至少存在一个重复的整数。假设nums只有一个重复的整数,找出这个重复的数。

注意:题目要求不修改原数组 & 常量空间复杂度;

思路:Floyd 判圈算法

找到相遇点:value=6

class Solution {public int findDuplicate(int[] nums) {//Floyd 判圈算法int slow = 0, fast = 0;do {slow = nums[slow];fast = nums[nums[fast]];} while (slow != fast);//注意此时可能指向的同一个index,而不是不同index的相同valueslow = 0;while (slow != fast) {slow = nums[slow];fast = nums[fast];}return slow;}
}

2 数组交集

两个数组的交集:输出结果中的每个元素一定是唯一的。

两个数组的交集 II:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。

【提升1】如果给定的数组已经排好序呢?你将如何优化你的算法?

【提升2】如果 nums1 的大小比 nums2 小,哪种方法更优?

【提升3】如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

7.3 数字游戏

  • 珠玑妙算:给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜中的次数answer,其中answer[0]为猜中的次数,answer[1]为伪猜中的次数。

  • 猜数字游戏:请写出一个根据秘密数字和朋友的猜测数返回提示的函数,返回字符串的格式为xAyB,x和y都是数字,A表示公牛,用B表示奶牛。

  • 有效的数独:判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

  • 分糖果:给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。

  • 扑克牌中的顺子:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为14。

7.4 缓存机制

  • LRU 缓存机制和LRU 缓存-面试题版本:运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。学java的同学可以试试基于LinkedHashMap的代码。

  • LFU 缓存:请你为最不经常使用(LFU)缓存算法设计并实现数据结构。

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

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

相关文章

C++ 基础 输入输出

一 C 的基本IO 系统中的预定义流对象cin和cout: 输入流&#xff1a;cin处理标准输入&#xff0c;即键盘输入&#xff1b; 输出流&#xff1a;cout处理标准输出&#xff0c;即屏幕输出&#xff1b; 流&#xff1a;从某种IO设备上读入或写出的字符系列 使用cin、cout这两个流对…

什么是HTTP?

什么是HTTP&#xff1f; HTTP基本概念HTTP 是什么&#xff1f;HTTP 常见的状态码有哪些&#xff1f;HTTP 常见字段有哪些&#xff1f; HTTP特性HTTP/1.1 的优点有哪些&#xff1f;HTTP/1.1 的缺点有哪些&#xff1f; HTTP基本概念 HTTP 是什么&#xff1f; HTTP 是超文本传输…

设计模式(2)——工厂方法模式

目录 1. 摘要 2. 需求案例(设计一个咖啡店的点餐系统) 2.1 咖啡父类及其子类 2.2 咖啡店类与咖啡类的关系 3. 普通方法实线咖啡店点餐系统 3.1 定义Coffee父类 3.2 定义美式咖啡类继承Coffee类 3.3 定义拿铁咖啡继承Coffee类 3.4 定义咖啡店类 3.5 编写测试类 4. 简…

故障——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题纯数学&#xff0c;考察贝叶斯公式 AC_Code #include <bits/stdc.h> using namespace std; typedef pair<int,double> PI; bool cmp(PI a,PI b){if(a.second!b.second)return a.second>b.second;return a.first<b.first; } int main() {i…

Java毕设之基于springboot的医护人员排班系统

运行环境 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) 系统详细实现 医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及…

2024年大学生三下乡社会实践活动投稿注意事项

随着2024年夏季的热浪一同涌来的,是我校一年一度的“大学生三下乡”社会实践活动。作为一名积极参与其中的大学生,我满怀激情地投身于这项旨在促进农村发展的公益行动中。然而,当活动圆满落幕,轮到我承担起向各大媒体投稿、传播实践成果的重任时,却遭遇了一系列意想不到的挑战,…

端口占用解决方法

1、查询端口 打开cmd命令提示符窗口&#xff0c;输入以下指令查询所有端口 netstat -ano //查询所有端口 netstat -ano|findstr 8080 //查询指定端口 2、杀死进程 taskkill /t /f /im 进程号(PID)

【Ansible】ansible-playbook剧本

playbook 是ansible的脚本 playbook的组成 1&#xff09;Tasks&#xff1a;任务&#xff1b;通过tasks 调用ansible 的模板将多个操作组织在一个playbook中运行 2&#xff09;Variables&#xff1a;变量 3&#xff09;Templates&#xff1a;模板 4&#xff09;Handles&#xf…

车载测试系列:入行车载测试分享

车载测试前景如何&#xff1f; 软件定义汽车时代的发展趋势&#xff0c;随着控制器自主开发力度的加强&#xff0c;作为V流程中必备环节&#xff0c;车载测试工程师岗位需求会越来越多&#xff1b;控制器集成化&#xff0c;功能集成程度越来越高&#xff0c;对于测试工程师的知…

度小满——征信报告图建模

目录 背景介绍 发展趋势 技术演进 图在金融风控领域中的演进 度小满图机器学习技术体系 案例 征信报告介绍 征信报告图建模

Vuex 和 Pinia 两个状态管理模式的区别

Pinia和Vuex一样都是是vue的全局状态管理器。其实Pinia就是Vuex5&#xff0c;只不过为了尊重原作者的贡献就沿用了这个看起来很甜的名字Pinia。&#xff08;实际项目中千万不要即用Vuex又用Pinia&#xff0c;不然你会被同事‘’请去喝茶的‘’。 一、安装&#xff08;常用命令安…

JavaScript百炼成仙自学笔记——13

函数七重关之六&#xff08;“new”一个函数&#xff09; 看个代码&#xff1a; function hello(){console.log(this); } 1、this&#xff1a;也是JavaScript中的一个关键字&#xff0c;永远指向当前函数的调用者 解释一下,有两层意思&#xff1a; ①this要嘛不出现&#…

深入理解 Linux 文件系统与动静态库

目录 一、Linux 文件系统中的 inode 二、软硬链接 三、动静态库 在 Linux 系统中&#xff0c;文件系统和动静态库是非常重要的概念。本文将带大家深入了解这些内容&#xff0c;让你在技术之路上更进一步。 一、Linux 文件系统中的 inode 何为文件系统&#xff1f;对计算机中…

通用型产品发布解决方案(基础环境搭建)

文章目录 1.项目技术栈和前置技术2.创建Linux平台1.需求分析2.安装Virtual Box1.BIOS里修改设置开启虚拟化设备支持&#xff08;f2 或f10&#xff09;2.任务管理器 -> cpu 查看虚拟化是否开启3.卸载方式4.安装6.1.265.管理员身份运行&#xff0c;选择安装位置6.一直下一步&a…

PHPStudy 访问网页 403 Forbidden禁止访问

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 注意&#xff1a;一定要安装解压软件 很多同学解压靶场代码以后访问报错的原因是&#xff1a;电脑上没有解压软件。 这个时候压缩包看起来就是黄色公文包的样子&#xff0c;右键只有“全部提取…

大厂Java面试题:MyBatis是如何进行分页的?分页插件的实现原理是什么?

大家好&#xff0c;我是王有志。 今天给大家带来的是一道来自京东的关于 MyBatis 实现分页功能的面试题&#xff1a;MyBatis是如何进行分页的&#xff1f;分页插件的实现原理是什么&#xff1f;通常&#xff0c;分页的方式可以分为两种&#xff1a; 逻辑&#xff08;内存&…

如何开启深色模式【攻略】

如何开启深色模式【攻略】 前言版权推荐如何开启深色模式介绍手机系统手机微信手机QQ手机快手手机抖音 电脑系统电脑微信电脑QQ电脑WPS电脑浏览器 最后 前言 2024-5-9 20:48:21 深色模式给人以一种高级感。 本文介绍一些常用软件深色模式的开启 以下内容源自《【攻略】》 仅…

从零开始写 Docker(十三)---实现 mydocker rm 删除容器

本文为从零开始写 Docker 系列第十三篇&#xff0c;实现类似 docker rm 的功能&#xff0c;使得我们能够删除容器。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#xff1a;深…

谷歌CEO最新访谈:AI浪潮仍处于早期阶段,公司未来最大威胁是执行力不足

作为搜索领域无可争议的霸主&#xff0c;谷歌改变了我们生活的方方面面&#xff0c;从日常琐事到工作事务&#xff0c;再到我们的沟通方式。多年来&#xff0c;谷歌一直是互联网的窗口&#xff0c;为我们提供大量知识和信息&#xff0c;但如今&#xff0c;随着其他类似平台的崛…

HarmonyOS开发之ArkTS使用:用户登录页面应用

目录 目录 前言 关于HarmonyOS 环境准备 新建项目 设计用户登录页面 1. 布局设计 2. 编写ArkTS代码 运行和测试 结束语 前言 随着HarmonyOS&#xff08;鸿蒙操作系统&#xff09;的不断发展&#xff0c;越来越多的开发者开始投入到这个全新的生态系统中&#xff0c;而…