LeetCode哈希表相关解法

news2024/11/17 2:28:10

哈希表

    • 1. 理论
      • 哈希碰撞的解决方法
        • 拉链法
      • 线性探测法
    • 2. 有效的字母异位词
      • [242. 有效的字母异位词](https://leetcode.cn/problems/valid-anagram/)
    • 3. 两个数组的交集
      • [349. 两个数组的交集](https://leetcode.cn/problems/intersection-of-two-arrays/)
    • 4. 快乐数
      • [202. 快乐数](https://leetcode.cn/problems/happy-number/)
    • 5.两数之和
    • 6. 赎金信
      • [383. 赎金信](https://leetcode.cn/problems/ransom-note/)
    • 7. 三数之和
      • [15. 三数之和](https://leetcode.cn/problems/3sum/)
        • 双指针法

1. 理论

哈希碰撞的解决方法

拉链法

冲突采用链表的方式剞劂

哈希表4

线性探测法

放入元素的时候,如果碰撞了,就往后找一个空位放该元素

要求tableSize一定要大于dataSize ,要不然哈希表上就没有空置的位置来存放冲突的数据了

img

2. 有效的字母异位词

242. 有效的字母异位词

先遍历一遍第一个字符串,把每个字符放入Map中,重复则个数+1
然后遍历第二个,遇上就个数-1,如果是字母异位词的话,最终每个字母的个数一定为0

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length() != t.length()){
            return false;
        }
        Map<Character, Integer> map = new HashMap<>();
        char[] arr1 = s.toCharArray();
        char[] arr2 = t.toCharArray();

        for(int i = 0; i < arr1.length; i++){
            if(map.containsKey(arr1[i])){
                map.put(arr1[i], map.get(arr1[i]) + 1);
            }else{
                map.put(arr1[i], 1);
            }
        }

        for(int i = 0; i < arr2.length; i++){
            if(map.containsKey(arr2[i])){
                if(map.get(arr2[i]) == 0){
                    return false;
                }
                map.put(arr2[i], map.get(arr2[i]) - 1);
            }else{
                return false;
            }
        }
        return true;
      

    }
}

追求更快的话,可以使用长度为26的数组,然后也是差不多的思想,一个遇上就+1,第二个遇上减1

242.有效的字母异位词

3. 两个数组的交集

349. 两个数组的交集

  1. 先遍历第一个数组,存入map中,每个字符的个数为1
  2. 遍历第二个数组,如果map中有当前数字,并且为第一次出现,说明是交集
  3. 如何遍历map,找到出现次数为2的数字,放入数组(采用ArrayList,包装类会报错)
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<>();
        int sameNums = 0;

        for(int i = 0; i < nums1.length; i++){
            if(!map.containsKey(nums1[i])){
                map.put(nums1[i], 1);
            }
        }

        
        for(int i = 0; i < nums2.length; i++){
            if(map.containsKey(nums2[i]) && map.get(nums2[i]) == 1){
                map.put(nums2[i], 2);
                sameNums++;
            }
        }

        int[] res = new int[sameNums];
        int index = 0;

        for(Integer i: map.keySet()){
            if(map.get(i) == 2){
                res[index] = i;
                index++;
            }
        }

        return res;
    }
}

4. 快乐数

202. 快乐数

用一个Set存储出现过的数字,如果一个数字经过变化后再次变为了原来的数字,那他肯定不是快乐数

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
		
        while(n != 1 && !set.contains(n)){
            set.add(n);
            n = getNextNumber(n);
        }

        return n == 1;
    }

    private int getNextNumber(int n) {
        int sum = 0;
        while(n > 0){
            int tail = n % 10;
            sum += tail * tail;
            n /= 10;
        }
        return sum;
    }
}

5.两数之和

  1. 因为题目要找的两个数之和为target,我们可以把nums数组中第一个元素的target - num 以及 num的下标分别放入 HashMap<Integer,Integer>的Key 和 Value中
  2. 按照这种方法遍历数组,进行判断,如果有元素和HashMap中的Key值相等的话,那么他们的和为target
  3. 输出结果
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
         //放入第一个数,K中为差,V中为下标
        map.put(target - nums[0],0);
        for (int i = 1; i < nums.length; i++) {
            //如果该元素和HashMap中的某个Key值相等的话,结束
            if(map.containsKey(nums[i])){
                int index = map.get(nums[i]);
                return new int[]{index,i};
            }else {
                //放入HashMap
                map.put(target - nums[i],i);
            }
        }
        return new int[0];
    }
}

6. 赎金信

383. 赎金信

类似字母异位词

  1. 第一个数组全放入map,如果相等就次数+1
  2. 第二个数组如果遇到对应的字符,就次数-1
  3. 如果最终map中次数都<=0 那么可以完成
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        if(ransomNote.length() > magazine.length()){
            return false;
        }

        Map<Character, Integer> map = new HashMap<>();
        char[] arr1 = ransomNote.toCharArray();
        char[] arr2 = magazine.toCharArray();

        for(int i = 0; i < arr1.length; i++){
            if(map.containsKey(arr1[i])){
                map.put(arr1[i], map.get(arr1[i]) + 1);
            }else{
                map.put(arr1[i], 1);
            }
        }

        for(int i = 0; i < arr2.length; i++){
            //如果存在,个数-1
            if(map.containsKey(arr2[i])){
                map.put(arr2[i], map.get(arr2[i]) - 1);
            }
        }

        for(Character c: map.keySet()){
            if(map.get(c) > 0){
                return false;
            }
        }
        
        return true;
    }
}

7. 三数之和

15. 三数之和

这题用哈希法很麻烦

双指针法

15.三数之和

  1. 先进行排序
  2. i 遍历 数组, left从i+1开始,right从 n-1开始, left 和 right向中间移动,这个过程可能发现多组,可能有重复
  3. 如果 nums[i] == nums[i - 1] 当前和上一个相同则重复了(i left right 都要进行重复的判断)
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);

        List<List<Integer>> list = new ArrayList<>();

        for (int i = 0; i < nums.length; i++) {
            //开头>0,不可能等于0
            if (nums[i] > 0) {
                return list;
            }

            // 去重i 和上一个(左边)的比较
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            int left = i + 1;
            int right = nums.length - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if (sum < 0) {
                    left++;
                } else if (sum > 0) {
                    right--;
                } else {
                    list.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    //去重left 和下一个(左边)的比较
                    while (right > left && nums[right] == nums[right - 1]) right--;
                    //去重right 和下一个(右边)的比较
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    left++;
                    right--;
                }
            }
        }

        return list;
    }
}

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

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

相关文章

16_tomcat

tomcat 一、jsp一句话木马 这个东西网上百度就有 <%!class U extends ClassLoader {U(ClassLoader c) {super(c);}public Class g(byte[] b) {return super.defineClass(b, 0, b.length);}}public byte[] base64Decode(String str) throws Exception {try {Class clazz …

Coresight - HW Assisted Tracing on ARM

文章目录一、Introduction二、Acronyms and Classification2.1 Acronyms2.2 Classification三、Device Tree Bindings四、Framework and implementation五、Device Naming scheme六、Topology Representation七、How to use the tracer modules7.1 Using the sysFS interface7.…

如何实现RTMP协议

认识rtmp rtmp是Adobe公司出品的流媒体传输协议&#xff0c;它的全称是Real Time Messaging Protocol&#xff0c;是一个实时消息传输协议&#xff0c;学习RTMP一定要抓住 一个关键点&#xff1a;消息。 rtmp协议的原文可以在Adobe官网下载&#xff0c;内容十分精简&#xff…

用户身份管理(CIAM)如何帮助业务持续增长?|身份云研究院

精明的决策者很早就意识到&#xff0c;数字化转型的核心是为用户提供完善的“数字旅程”&#xff0c;这里的用户包括“员工”和“客户”&#xff0c;而“数字旅程”的核心则是持续提供优质的「数字用户体验&#xff08;DCX&#xff09;」。本文将主要探讨如何制定完善“客户数字…

window版Docker打包镜像并上传到服务器使用

背景&#xff1a;利用jmeter实现自动化进行线上监视&#xff0c;要部署于多台服务器上监视&#xff0c;为了节省时间&#xff0c;方便使用&#xff0c;最终决定使用docker将自动化脚本打包成镜像&#xff0c;这样只要服务器上安装docker环境&#xff0c;直接下载镜像就可以使用…

2023全新SF授权系统源码 V3.7全开源无加密版本

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 SF多应用综合验证授权系统 V4.0更新内容 采用ThinkPHP 6.0 EasyWebAdmin 支持自定义判断规则&#xff08;默认提供域名QQ机器码规则&#xff09; 支持在线充值&#xff0c;用户Api授权&…

(免费分享)springboot人事管理系统

基础环境&#xff1a;1. JDK:1.82. MySQL:5.73. Maven3.01. 核心框架&#xff1a;Spring Boot 2.2.13.RELEASE2. ORM框架&#xff1a;MyBatisPlus 3.1.23. 数据库连接池&#xff1a;Druid 1.2.84. 安全框架&#xff1a;Apache Shiro 1.8.05. 日志&#xff1a;SLF4J &#xff0c…

最近邻插值法

文章目录前言一、最近邻插值法二、代码实现总结本章节进入图像处理&#xff0c;利用python语言来实现各种图像处理的方法&#xff0c;从软件角度去理解图像处理方法&#xff0c;为后期的FPGA处理图像做准备。 前言 一、最近邻插值法 最近邻插值就是在目标像素点上插入离对应原…

界面控件DevExpress WinForm中文教程 - 如何应用Windows 11 UI?

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

全网最详细的org.springframework.jdbc.UncategorizedSQLException的多种解决方法

文章目录1. 引出问题2. 分析问题3. 解决问题4. 解决该问题的其他方法4.1 方法14.2 方法24.3 方法34.4 方法4如果你遇到的问题不是我所遇到的问题&#xff0c;可以使用最下面的方法解决你遇到的这个错误。 1. 引出问题 今天在写“Mybatis-Plus中分页插件PaginationInterceptor…

利用Python读取外部数据文件

名字&#xff1a;阿玥的小东东 学习&#xff1a;python、c 主页&#xff1a;阿玥的小东东 目录 一、读取文本文件的数据 二、读取电子表格文件 三、读取统计软件生成的数据文件 不论是数据分析&#xff0c;数据可视化&#xff0c;还是数据挖掘&#xff0c;一切的一切全都是以…

java常用类: Arrays类的常用方法

java常用类型: Ineteger等包装类 String类&#xff0c;StringBuffer类和StringBuilder类 Math类及常用方法 System类及常用方法 Arrays类及常用方法 BigInteger类和BigDecimal类及常用方法 日期类Date类,Calender类和LocalDateTime类 文章目录ArraysArrays常用方法Arrays.sort(…

全排列问题的解题思路

假设有这么个正整数n&#xff0c;要求输出1到n的所有排列&#xff1f;   输入&#xff1a;3 输出&#xff1a;123&#xff0c;132&#xff0c;213&#xff0c;231&#xff0c;312&#xff0c;321 一、无脑循环求解&#xff1f; 拿到这个问题&#xff0c;当然我的第一个想法就…

上下文驱动的图上文案生成

✍&#x1f3fb; 本文作者&#xff1a;持信、弈臻、悟放、积流、孟诸1. 摘要为商品图片上特定位置配上装饰性文案来突出重点在广告业务中有着十分广泛的应用前景。然而&#xff0c;现有的图片文案描述生成系统均生成与图片位置关系无关的文案&#xff0c;无法很好地应用到广告业…

66. Python 类的总结

66. 类的总结 文章目录66. 类的总结1. 类2. 对象3. 类的语法4. 属性5. 方法6. 创建对象7. 调用属性8. 调用方法9. 方法的值的传递第1情况&#xff1a;没有值第2种情况&#xff1a;有值10. __init__方法1. __init__写法2. __init__作用3. 重点关注11. 自定义函数和方法的异同1. …

Unity渲染管线(Render Pipeline)笔记

Rendering是什么 渲染Rendering可以理解为将拿到的3D数据生成一副2D图像的过程。 这些3D数据包含&#xff1a;3D模型本身的点的信息&#xff0c;三角形面的描述信息&#xff0c;模型应用的材质以及摆放的虚拟相机的信息等。Rendering过程会使用全部的数据&#xff08;物体的几何…

摄像头录像大师推荐?如何录制摄像头,图文教程

现如今&#xff0c;很多笔记本电脑上都会携带摄像头&#xff0c;用来录制摄像头画面&#xff0c;方便小伙伴的时候。可很多小伙伴却表示&#xff0c;自己不知道电脑摄像头画面该如何录制。有什么有什么好用的摄像头录制大师&#xff1f;如何录制摄像头画面&#xff1f;本篇文章…

【10w字】超详细【百分百拿offer】的面试教程,接口测试篇

1.请问你是如何做接口测试的&#xff1f; 大体来说&#xff0c;经历以下过程&#xff1a;接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。 具体来说&#xff0c;接口测试流程分成以下九步&#xff1a; 第一步&…

RabbitMq之发布确认(高级)

一.发送消息到交换机失败 正常情况下生产者只发布消息到交换机&#xff0c;无法确定是否成功把消息发送到交换机当中&#xff0c;由此发布确认的回调函数可以通知生产者消息是否发送到了交换机。 代码如下 1.先创建交换机、队列等信息 package jot.jothot.testMq;import or…

OS 学习笔记(6) 操作系统引导

OS 学习笔记(6) 操作系统引导 这篇笔记对应的王道OS 1.5 操作系统引导&#xff0c;同时参考了 《Operating System Concepts, Ninth Edition》和 俗称ostep的《 Operating Systems: Three Easy Pieces》还有 《Operating Systems: Principles and Practice》 文章目录OS 学习笔…