算法系列--哈希表

简介: 算法系列--哈希表

💕"白昼之光,岂知夜色之深。"💕

作者: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()和方法调用的时间


目录
相关文章
|
2月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
182 10
|
2月前
|
存储 算法 安全
控制局域网电脑上网的 PHP 哈希表 IP 黑名单过滤算法
本文设计基于哈希表的IP黑名单过滤算法,利用O(1)快速查找特性,实现局域网电脑上网的高效管控。通过PHP关联数组构建黑名单,支持实时拦截、动态增删与自动过期清理,适用于50-500台终端场景,显著降低网络延迟,提升管控灵活性与响应速度。
104 8
|
7月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
174 2
|
2月前
|
存储 运维 监控
局域网网络监控软件的设备连接日志哈希表 C++ 语言算法
针对局域网监控软件日志查询效率低的问题,采用哈希表优化设备连接日志管理。通过IP哈希映射实现O(1)级增删查操作,结合链地址法解决冲突,显著提升500+设备环境下的实时处理性能,内存占用低且易于扩展,有效支撑高并发日志操作。
157 0
|
9月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
11月前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
8月前
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
210 14
|
8月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
278 7
|
8月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
176 4
|
8月前
|
存储 监控 算法
单位电脑监控软件中 PHP 哈希表算法的深度剖析与理论探究
数字化办公的时代背景下,单位电脑监控软件已成为企业维护信息安全、提升工作效率的关键工具。此类软件可全面监测员工的电脑操作行为,收集海量数据,故而高效管理和处理这些数据显得尤为重要。数据结构与算法在此过程中发挥着核心作用。本文将聚焦于哈希表这一在单位电脑监控软件中广泛应用的数据结构,并通过 PHP 语言实现相关功能,为优化单位电脑监控软件提供技术支持。
147 3