Hot100-哈希法

news2024/12/26 11:21:33

1. 两数之和 - 力扣(LeetCode)

在做面试题目的时候遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        for (int i = 0; i < nums.length;i++){
            for (int j= nums.length-1; j>=i+1; j--){
                if (nums[i]+nums[j]==target){
                    result[0] = i;
                    result[1] = j;
                }
            }
        }
        return result;
    }
}

注意:

1.int是基本属性,所以直接用nums.length,不用调用方法()

2.新建数组时要规定好数组的长度:int[] result = new int[2]

3.for循环是nums.length - 1

使用哈希法优化:

什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。

本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。

那么我们就应该想到使用哈希法了。

因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        //剪枝
        if (nums==null || nums.length==0){
            return null;
        }
        //查询:使用哈希法
        //Map,key value, key放被加数,value放索引值(最后result里面放的是索引值)
        Map<Integer, Integer> map= new HashMap();
        for (int i = 0; i < nums.length ;i++){
            int temp = target - nums[i];
            if (map.containsKey(temp)){
                result[0]=i;
                result[1]=map.get(temp);
                break;
            }    
          map.put(nums[i], i); 
          // 如果这一轮没找到匹配对,就把访问过的元素和下标加入到map中;方便后续匹配 temp = target - nums[i];

        }
        return result;
    }
}

注意:

1.map的key存储被加数,value存储索引

2.用到了map的几个方法:

map.containsKey(temp):判断map中是否包含需要的key

map.get(temp):获取temp对应的value

map.put(nums[i], i):将键值对存入map

49. 字母异位词分组 - 力扣(LeetCode)

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
// 由于互为字母异位词的两个字符串包含的字母相同,
// 因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。
// 比如:"nat","tan",转为char以后,再sort,都得到ant,则赋值到map,它们就有相同的key;
// 再将"nat","tan"以value的形式对应相同的key插入map
// 最终返回map的value(list)即可

    Map<String, List<String>> map = new HashMap();
    for(String str:strs){
        char[] array = str.toCharArray();
        Arrays.sort(array);
        String key = new String(array);
        List<String> list = new LinkedList();
        list = map.getOrDefault(key, new ArrayList<String>());
        list.add(str);
        map.put(key,list);
    }
    return new ArrayList<List<String>>(map.values());
    }
}

注意:

1.char[] array = str.toCharArray()用的是toCharArray()方法

`toCharArray()` 是一个用于将字符串转换为字符数组的方法。

例如,如果 `str` 是 “Hello”,那么 `str.toCharArray()` 将返回一个包含字符 ‘H’, ‘e’, ‘l’, ‘l’, ‘o’ 的字符数组。

2. list = map.getOrDefault(key, new ArrayList<String>());

  • 如果 `map` 中存在 `key`,则将与 `key` 相关联的值赋给 `list`
  • 如果 `map` 中不存在 `key`,则将一个新的 `ArrayList<String>` 赋给 `list`

3. map.put(key,list);最后要记得把键值对加入map!

4.return new ArrayList<List<String>>(map.values());

`map.values()` 用于获取 `map` 中所有的值,并将这些值放入一个新的 `ArrayList` 中,然后作为返回值。

`map.values()` 返回的是一个 `Collection`,包含了 `map` 中所有的值。

128. 最长连续序列 - 力扣(LeetCode)

// 暴力算法:我们考虑枚举数组中的每个数 x,考虑以其为起点,不断尝试匹配 x+1,x+2,⋯是否存在,假设最长匹配到了 x+y
// 那么以 x 为起点的最长连续序列即为 x,x+1,x+2,⋯ ,x+y,其长度为 y+1我们不断枚举并更新答案即可。
  
//优化思路: 由于我们要枚举的数 x一定是在数组中不存在前驱数 x−1 的,不然按照上面的分析我们会从 x−1 开始尝试匹配,
// 因此我们每次在哈希表中检查是否存在 x−1即能判断是否需要跳过了。

class Solution {
    public int longestConsecutive(int[] nums) {
    //set去重
    Set<Integer> set = new HashSet<Integer>();
    for (int num: nums){
        set.add(num);
    }
    int result  = 0;

    for (int num: set){       
        if (!set.contains(num-1)){
            int CurNum = num;
            int CurResult = 1;
            while(set.contains(CurNum+1)){
                CurResult +=1;
                CurNum +=1;
            }
        result = Math.max(result, CurResult);
        }
    }
    //变量 CurResult 在 for 循环内部定义,因此它在循环外部是不可见的。
    //return  Math.max(0, CurResult);

    return result;
    }
}

注意:

1.用set去重

2.set有contains方法,用来判断是否存在num-1和num+1

3.set的初始化:Set<Integer> set = new HashSet();

4.最后不能写return  Math.max(0, CurResult);

因为变量 CurResult 在 for 循环内部定义,它在循环外部是不可见的。

会报错:

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

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

相关文章

风险防不胜防?看YashanDB如何守护你的数据库安全(下篇)

前言 上一篇文章&#xff0c;咱们主要讲了数据库安全机制中的访问管理~今天继续深入聊聊威胁监测以及数据保护&#x1f9d0; &#xff08;文末可回顾上篇文章噢&#x1f4d6;&#xff09; 02 威胁监测 安全审计 YashanDB语法上支持权限审计、行为审计和角色审计&#xff0c;…

开发规范:API安全

开发规范&#xff1a;API安全 API是现代移动、SaaS和web应用程序的关键组成部分&#xff0c;可以应用在面向客户、合作伙伴和内部应用程序中。API可以暴露应用程序逻辑和敏感数据。不安全的API很容易成为黑客攻击的目标&#xff0c;使他们能够访问安全的服务器或网络。攻击者可…

甘特图是什么?利用甘特图来优化项目管理流程

在现代项目管理中,图表是一种强大而直观的工具,可以帮助项目经理和团队成员清晰地了解并掌控整个项目进程。其中,甘特图是最常用和最有效的图表之一。 甘特图是一种条形图,可以用来直观地展示项目中各个任务的进度、持续时间和相互关系。它由一个横轴和一个纵轴组成。横轴代表时…

Docker搭建LNMP+Wordpress的实验

目录 一、项目的介绍 1、项目需求 2、服务器环境 3、任务需求 二、Linux系统基础镜像 三、部署Nginx 1、建立工作目录 2、编写Dockerfile 3、准备nginx.conf配置文件 4、设置自定义网段和创建镜像和容器 5、启动镜像容器 6、验证nginx 三、Mysql 1、建立工作目录…

Vue集成three.js,加载glb、gltf类型的3d模型

安装基本依赖 // 注意OrbitControls要加{}&#xff0c;注意路径是jsm import { OrbitControls } from ‘three/examples/jsm/controls/OrbitControls.js’; // import { dat } from ‘three/examples/jsm/controls/dat.gui.js’; // dat gui这个插件&#xff0c;是另外自己下载…

CentOS命令大全:掌握关键命令及其精妙用法!

CentOS是一种流行的开源企业级Linux发行版&#xff0c;它基于Red Hat Enterprise Linux (RHEL)的源代码构建。对于系统管理员和运维工程师来说&#xff0c;掌握CentOS的常用命令至关重要。 这些命令不仅可以帮助管理服务器&#xff0c;还可以进行故障排查、性能监控和安全加固等…

面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?

一、写在开头 我们在上一篇写ReentrantReadWriteLock读写锁的末尾留了一个小坑&#xff0c;那就是读写锁因为写锁的悲观性&#xff0c;会导致 “写饥饿”&#xff0c;这样一来会大大的降低读写效率&#xff0c;而今天我们就来将此坑填之&#xff01;填坑工具为&#xff1a;Stam…

牛客NC99 多叉树的直径【较难 深度优先 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a77b4f3d84bf4a7891519ffee9376df3 思路 核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf. 就是普通dfs的同时算路径长度。时间: O(n), DFS一次 空间: O(n)参考答案Java impo…

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁&#xff08;spin lock&#xff09;原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流&#xff1a;可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

Webpack-入门

定义 静态模块&#xff1a;指的是编写代码过程中的html&#xff0c;css&#xff0c;js&#xff0c;图片等固定内容的文件 打包&#xff1a;把静态模块内容压缩、整合、翻译等&#xff08;前端工程化&#xff09; 1&#xff09;把less/sass转成css代码 2&#xff09;把ES6降级…

C语言-用二分法在一个有序数组中查找某个数字

1.题目描述 有15个数按由大到小顺序放在一个数组中&#xff0c;输入一个数&#xff0c;要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中&#xff0c;则输出“无此数” 二.思路分析 记录数组中左边第一个元素的下标为left&#xff0c;记录数组右边第一个…

GaussianCube:使用最优传输构造高斯溅射用于3D生成建模

GaussianCube: Structuring Gaussian Splatting using Optimal Transport for 3D Generative Modeling GaussianCube&#xff1a;使用最优传输构造高斯溅射用于3D生成建模 Bowen Zhang1⁣*    Yiji Cheng2⁣*   Jiaolong Yang3   Chunyu Wang3 张博文 1⁣* 程一季 2⁣* …

10.shell数组

shell数组 数组基本概述什么是数组数组的分类普通数组关联数组 数组的遍历与循环案例1:案例2:案例3:案例4: 数组基本概述 什么是数组 数组其实也算是变量&#xff0c;传统的变量只能存一个值&#xff0c;但是数组可以存多个值。 实际使用中主要通过for循环遍历数组中的数据 …

【万字长文】看完这篇yolov4详解,那算是真会了

前言 目标检测作为计算机视觉领域的一个核心任务&#xff0c;其目的是识别出图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。YOLO&#xff08;You Only Look Once&#xff09;系列模型因其检测速度快、性能优异而成为该领域的明星。随着YOLOv4的推出&#xff0c;…

16 秒杀场景如何保证命中的存储分片不挂

从“第 12 讲”到“第 14 讲”&#xff0c;我们介绍了可以应对百万并发扣减请求&#xff0c;以及同时能够保障高性能的架构方案。此外&#xff0c;上述的架构方案还具备水平扩展能力&#xff0c;即当流量增加后&#xff0c;可以通过扩容底层存储和应用服务器来应对。 但面对百…

7-29 删除字符串中的子串

题目链接&#xff1a;7-29 删除字符串中的子串 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码&#xff08;python&#xff09; 1. 代码实现 str1 input().split(\n)[0] str2 input().split(\n)[0] while str2 in str1:str1 str1.replace(str2, "") // 删…

Elasticsearch概念 使用docker安装Elasticsearch和kibana

目录 一、Elasticsearch概念 倒排索引和正向索引 正向和倒排 二、ES安装 三、安装 kibana 四、IK分词器 下载ES中文分词器 扩展或停用词条 一、Elasticsearch概念 倒排索引和正向索引 正向索引 就像在mysql数据中搜索非主键字段的内容&#xff0c;就需要逐条数据的去查…

IDM下载器_Internet Download Manager 6.42.7

网盘下载 IDM下载器是一款针对互联网所打造的下载管理器。IDM下载器能将下载速度提高5倍&#xff0c;恢复因丢失的连接&#xff0c;网络问题&#xff0c;计算机关闭或意外断电而重新启动中断或中断的下载。IDM下载器还可支持所有流行的浏览器&#xff0c;以使用独特的“高级浏…

记录一次 vue3 + ele pls 改写 饿了么主题色实践

一、改写 element 主题色 在 main.ts 中引入需要改写的 scss 文件 main.ts: import ./styles/element-plus.scss在自定义的 element-plus.scss 文件中改写 ele pls 的变量 element-plus.scss&#xff1a; /** * 更改主题色 */ :root {--el-color-primary: #285fbb; // 主…

【智能算法】土拨鼠优化算法(PDO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;AE Ezugwu等人受到土拨鼠觅食行为与自然行为启发&#xff0c;提出了土拨鼠优化算法&#xff08;Prairie Dog Optimization algorithm, PDO&#xff09;。 2.算法原理 2.1算法思…