算法系列--哈希表

💕"白昼之光,岂知夜色之深。"💕
作者:Mylvzi
文章主要内容:算法系列–哈希表
在这里插入图片描述

今天为大家带来的是算法系列--哈希表

1.两数之和

链接:
https://leetcode.cn/problems/two-sum/submissions/515941642/

分析:

有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。

最容易想到的思路就是暴力解法,每遍历到一个数字,就去从头遍历看有没有相加符合条件的数字,但是这样的时间复杂度达到了O(N^2),使用哈希表可以降低到O(N)

之所以是n^2是因为我么在查找第二个数的时候又套了一层for循环,既然涉及到在一堆数中快速查找某一个数,就可以使用hash表进行优化,思路如下:

  • 每遍历到一个数,就将其数值和下标存入到哈希表之中
  • 判断哈希表中是否存在target-nums[i]的数字,如果有返回这两个数的下标,如果没有继续遍历

代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 使用哈希表建立数字与下标之间的映射关系
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            // 去看是否包含target-i
            if(map.containsKey(target-nums[i])) {
                return new int[]{map.get((target-nums[i])),i};// 返回下标
            }
            
            map.put(nums[i],i);
        }
        
        return null;
    }
}

2.判断是否互为字符重排

链接:
https://leetcode.cn/problems/check-permutation-lcci/description/

分析:
本题最直观的想法就是创建出两个哈希表,分别存储字符串中的所有内容,最后判断两个哈希表是否相同即可

代码:

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if(s1.length() != s2.length()) return false;
        Map<Character,Integer> hash1 = new HashMap<>();
        Map<Character,Integer> hash2 = new HashMap<>();
        for(char c1 : s1.toCharArray()) {
            hash1.put(c1,hash1.getOrDefault(c1,0) + 1);
        }

        for(char c2 : s2.toCharArray()) {
            hash2.put(c2,hash2.getOrDefault(c2,0) + 1);
        }

        return hash1.equals(hash2);
    }
}

注意本题还可以使用排序的思想,将两个字符串进行排序,然后直接判断是否相同即可

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if (s1.length() != s2.length()) return false;

        char[] ss1 = s1.toCharArray();
        char[] ss2 = s2.toCharArray();

        Arrays.sort(ss1);
        Arrays.sort(ss2);

        return Arrays.equals(ss1, ss2);
    }
}

只有使用Arrays.equals()这个方法才能判断数组中的内容是否相同,因为里面重写了equals方法,如果直接比较,比较的是地址

3.存在重复元素 I

链接:
https://leetcode.cn/problems/contains-duplicate/description/

分析:

使用set来判断是否出现重复元素

代码:

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int n : nums) {// add()的返回值是布尔类型
            if(!set.add(n)) return true;
        }

        return false;
    }
}

注意: add()的返回值是布尔类型,用于表示此次添加是否成功.set具有去重的功能,如果添加的元素已经存在,就会添加失败

4.存在重复元素 II

链接:
https://leetcode.cn/problems/two-sum/submissions/515941642/https://leetcode.cn/problems/contains-duplicate-ii/description/

分析:

结合题意解决即可

代码:

class Solution {
    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]) && Math.abs(hash.get(nums[i]) - i) <= k) 
                return true;
            hash.put(nums[i],i);
        }
        
        return false;
    }
}

5.字⺟异位词分组

链接:
https://leetcode.cn/problems/group-anagrams/description/

分析:

本题更像是一道语法题,充分利用了java 的Map容器,相同的字母异位词指的是两个字符串中所包含的字符完全相等,也就是将他们按照ascii码值排序之后得到的结果完全相同,我们设这个排序之后的结果为pivot,那么我们就可以利用哈希表建立<pivot,List<String>>之间的映射关系

  • 对字符串进行排序,得到其pivot
  • 如果哈希表中不存在pivot,就新创建一个;如果存在,得到pivot对应的list,让其添加当前的字符串

代码:

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

        // 先对所有的字符串进行异或分组
        for(String str : strs) {
            char[] tmp = str.toCharArray();
            Arrays.sort(tmp);// 排序  得到pivot
            String key = new String(tmp);// 转化为字符串
            
            List<String> list = hash.getOrDefault(key, new ArrayList<String>());// 注意有可能不存在
            list.add(str);// 添加上当前的字符串
            hash.put(key,list);// 插入哈希表
        }
        
        return new ArrayList(hash.values());// 注意这个语法!可以直接返回hash的所有value的集合
    }
}

总结:
哈希表的使用场景

  1. 快速的寻找某一个元素
  2. 记录出现的次数

哈希表的优化:

  • 使用数组来模拟哈希表,往往出现在数据量较小的时候,省去了new()和方法调用的时间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《C++ Primer 第五版 中文版》第12章 动态内存【阅读笔记 + 个人思考】

《C Primer 第五版 中文版》第12章 动态内存【阅读笔记 个人思考】 12.1 动态内存与智能指针12.1.1 shared_ptr类 静态内存包括&#xff1a;初始化只读数据段&#xff0c;初始化读写数据段&#xff0c;未初始化数据和常量数据段。 详细在下面博客总结&#xff1a; Linux系统下…

吴恩达机器学习-可选实验室:Softmax函数

文章目录 CostTensorflow稀疏类别交叉熵或类别交叉熵祝贺 在这个实验室里&#xff0c;我们将探索softmax函数。当解决多类分类问题时&#xff0c;该函数用于Softmax回归和神经网络。 import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyl…

【数据结构】顺序表和链表详解顺序表和链表的实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;数据结构_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.线性表 1.1 顺序表 1.1.1 概念及结构 1.1.2 静态顺序表 1.1.3 动态顺序表 1.2 链表 1.2.1 链表的概念及结构 1.2.2 链表…

力扣HOT100 - 1. 两数之和

解题思路&#xff1a; 解法一&#xff1a;暴力 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i)for (int j i 1; j < n; j) {if (target nums[i] nums[j])return new int[] { i, j };}return new int[…

pcl利用kdtree计算点云密度

点云密度挺需要的,很多时候需要知道点云密度才能进行下一步 这里利用kdtree计算点云密度 代码 结果 这里单位写错了&#xff0c;抱歉

Personal Website

Personal Website Static Site Generators hexo hugo jekyll Documentation Site Generator gitbook vuepress vitepress docsify docute docusaurus Deployment 1. GitHub Pages 2. GitLab Pages 3. vercel 4. netlify Domain 域名注册 freessl 域名解析域名…

【数据结构与算法】Kruskal最小生成树

原理 算法实现 主要函数&#xff1a; 查并集&#xff1a; find 点 x 的祖先edge的比较大小函数kruskal函数 #include<iostream> #include<algorithm>using namespace std;struct Edge{int a,b,w;}edg[200010]; int p[200010]; int n,m;bool compareEdg(const Ed…

Redis 教程系列之Redis 安装(二)

Windows 下安装 下载地址:Releases tporadowski/redis GitHub。 Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。 打开文件夹,内容如下: 打开一个 cmd 窗口 使用 c…

Apache TinkerPop 与 Gremlin 快速介绍

TinkerPop &#xff0c;Gremlin TinkerPop 是一个 Apache 项目&#xff0c;它为图数据库提供了一个通用的图处理框架。Gremlin 是 TinkerPop 框架的一部分&#xff0c;它是一个图遍历语言&#xff0c;用于在图数据库中执行复杂的图遍历查询。 Apache TinkerPop Apache Tinker…

AI程序员革命:探析Devin的登场与编程未来

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【前端Vue】HR-saas中台项目开发md文档第1篇:vuex基础-介绍,vuex基础-初始化功能【附代码文档】

HR-saas中台管理项目开发完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vuex基础-介绍,vuex基础-初始化功能,vuex基础-state,vuex基础-mutations,vuex基础-actions,vuex基础-getters。项目课设计&#xff0c;人力资源的环境搭建vue-element-admin的了解和…

react native 键盘事件

在做修改密码功能是发现他的键盘第一次调起之后然后收起键盘焦点不会消失而且键盘也不会再调起来了 我门线引入需要的组件 import { StyleSheet, View, TextInput, Keyboard, TouchableWithoutFeedback, } from react-native; import React, {useEffect, useState, useRef} fr…

【数据结构】Java中Map和Set详解(含二叉搜索树和哈希表)

目录 Map和Set详解 1.二叉搜索树 2.Map常见方法 3.Set常见方法 4.哈希表 Map和Set详解 Map&#xff1a;一种键值对结构&#xff0c;hashMap中键和值均可以为空&#xff0c;hashTable中则不可以存放null值 Set&#xff1a;一种集合&#xff0c;不能存放重复元素&#xff0c…

解决前端跨域问题

前端跨域问题 该问题是由于前端的服务路径或端口和后台的不一致所导致的 Springboot跨域设置 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; …

手撕算法-二叉树的层序遍历

描述 分析 层序遍历&#xff0c;需要用到队列。 代码 代码1&#xff1a;独立bfs函数 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(i…

(C语言)浮点数在内存中的存储详解

1. 浮点数 常见的浮点数&#xff1a;3.14159、 1E10等 &#xff0c;浮点数家族包括&#xff1a; float、double、long double 类型。 浮点数表示的范围&#xff1a; float.h 中定义. 2. 浮点数的存储 我们先来看一串代码&#xff1a; int main() {int n 9;float* pFloa…

BufferedInputStream解读

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java之IO流啦&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好习惯&am…

实现文本溢出提示效果

实现效果 本文的需求是文本溢出时显示省略号&#xff0c;鼠标移入文本时提示完整的文字内容。 实现代码 <div class"container" onmouseover"handleMouseEnter(this)">鼠标移入显示全部内容</div><style> .container {width: 100px;o…

力扣每日一题 2024/3/23 统计桌面上的不同数字

题目描述 用例说明 思路讲解 给定整数n&#xff0c;找出循环十亿天后桌上的数字。可以先通过一天来找找规律。 第一天 n%i1 &#xff08;1<i<n&#xff09;只有n-1符合.加入桌面 第二天(n-1)%i1 &#xff08;1<i<n-1&#xff09;只有n-2符合 加入桌面 依次类推…

第十三届蓝桥杯JavaB组省赛真题 - 星期计算

解题思路&#xff1a; 方法一&#xff1a; 20的22次方是一个比较大的数&#xff0c;long和int都装不下这么大的数&#xff0c;因此需要使用下面的方法&#xff0c;如果 a, b, p 都是整数&#xff0c;且 p 是正数&#xff0c;那么&#xff1a;(a * b) % p (a % p * b % p) % …