【算法系列篇】哈希表

这篇具有很好参考价值的文章主要介绍了【算法系列篇】哈希表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法系列篇】哈希表,算法,算法,散列表,数据结构

前言

哈希表(Hash Table)是一种依赖哈希函数组织数据,以达到常数级别时间复杂度,插入和搜索都非常高效的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表在查询数据方面有着突出的优势。那么今天我将为大家分享关于哈希表方面的算法。

1. 两数之和

https://leetcode.cn/problems/two-sum/?envType=list&envId=9Lulrn6r

1.1 题目要求

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
class Solution {
    public int[] twoSum(int[] nums, int target) {

    }
}

1.2 做题思路

这道题目的要求很简单,就是在数组中查找两个和为 target 的数。使用暴力解法就是列举出数组中任意两个数的组合,看它们的和是否等于target,暴力解法的时间复杂度为 O(N*2) 。

既然是查询的话,我们就可以用到哈希表这个数据结构来降低时间复杂度。使用哈希表只需要遍历一遍数组,当遍历到一个数的时候,就看哈希表中是否存在一个数等于 target - nums[i] 如果有则返回当前这个数的下标和哈希表中存储的 target - num[i] 的下标;如果不存在,则将该位置的数作为 key 值,该位置的下标作为 value 值存放进哈希表中。

1.3 Java代码实现

class Solution {
    public int[] twoSum(int[] nums, int target) {
    	//创建出一个哈希表
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int t = target - nums[i];
            if (map.containsKey(t)) return new int[]{i, map.get(t)};
            map.put(nums[i], i);
        }

        return new int[]{-1,-1};
    }
}

【算法系列篇】哈希表,算法,算法,散列表,数据结构

2. 判断是否为字符重排

https://leetcode.cn/problems/check-permutation-lcci/?envType=list&envId=9Lulrn6r

2.1 题目要求

给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

示例 1:

输入: s1 = "abc", s2 = "bca"
输出: true 

示例 2:

输入: s1 = "abc", s2 = "bad"
输出: false

说明:

0 <= len(s1) <= 100 
0 <= len(s2) <= 100 
class Solution {
    public boolean CheckPermutation(String s1, String s2) {

    }
}

2.2 做题思路

判断是否为字符重排的方法就是看字符串 str2 中的字符是否都包含且只包含字符串 str1 中的字符,要想判断字符串 str2 中的字符是否存在于字符串 str1 中且数量一样,就可以用到哈希表来作为存储的容器。先遍历一遍字符串 str1,将字符串 str1 中遇到的字符以及字符出现的次数存储下来,然后在遍历字符串 str2 中的每个字符的时候就看哈希表中是否存在这个字符。

2.3 Java代码实现

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        int len1 = s1.length();
        int len2 = s2.length();
        //当两个字符串长度不相同的时候可以直接返回
        if (len1 != len2) return false;
        //这里使用数组模拟出哈希表是因为题目中给出了字符串中的字符都是小写字母
        //字符的范围给了,数组的存储和读取速度相较于哈希表速度更快
        int[] hash = new int[26];
        for (int i = 0; i < len1; i++) {
            hash[s1.charAt(i) - 'a']++;
        }

        for (int i = 0; i < len2; i++) {
            if (--hash[s2.charAt(i) - 'a'] < 0) return false;
        }

        return true;
    }
}

【算法系列篇】哈希表,算法,算法,散列表,数据结构

3. 存在重复元素

https://leetcode.cn/problems/contains-duplicate/?envType=list&envId=9Lulrn6r

3.1 题目要求

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:

输入:nums = [1,2,3,1]
输出:true

示例 2:

输入:nums = [1,2,3,4]
输出:false

示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

提示:

1 <= nums.length <= 105
-109 <= nums[i] <= 109
class Solution {
    public boolean containsDuplicate(int[] nums) {

    }
}

3.2 做题思路

判断数组中是否存在重复元素,我们可以也可以使用哈希表这种数据结构来判断重复。HashSet 里面保证了容器中的元素只存在一个,具有去重性。

3.3 Java代码实现

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

        return false;
    }
}

【算法系列篇】哈希表,算法,算法,散列表,数据结构

4. 存在重复元素II

https://leetcode.cn/problems/contains-duplicate-ii/?envType=list&envId=9Lulrn6r

4.2 题目要求

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [1,2,3,1], k = 3
输出:true

示例 2:

输入:nums = [1,0,1,1], k = 1
输出:true

示例 3:

输入:nums = [1,2,3,1,2,3], k = 2
输出:false

提示:

1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {

    }
}

4.2 做题思路

这道题目是上面的重复元素的延展,这道题目不仅需要判断是否存在重复的元素,还需要判断这两个重复元素的下标的差值小于等于k。所以这个题目就需要用到哈希表 HashMap 这种数据结构,将某位置所表示的数字作为 key 值,该位置的下标作为 value 值存放在哈希表中。当该位置的数字在哈希表中存在的时候,就判断这两个数字的下标的差值是否小于等于k,如果小于则直接返回true,如果不小于,则需要更新哈希表中该key值的value值,因为这题目的要求是两个相等元素的下标差值小于等于k。

4.3 Java代码实现

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if(map.containsKey(nums[i])) {
                if(i - map.get(nums[i]) <= k) return true;
            }

			//这个操作不仅可以解决第一次添加的问题,也可以解决覆盖之前key的value
            map.put(nums[i], i);
        }

        return false;
    }
}

【算法系列篇】哈希表,算法,算法,散列表,数据结构

5. 字母异位词分组

https://leetcode.cn/problems/group-anagrams/

5.1 题目要求

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {

    }
}

5.2 做题思路

这个题目的意思就是将可以构成异位词的字符串分在一组,异位词就是两个字符串都是由相同字符以及字符数量相等的字符组成的字符串。但是这个题目有很多组的异位词,我们遍历字符串的时候又该如何判断该字符串属于哪一个组呢?难道要在遍历一遍哈希表吗,这样时间复杂度也会很高,所以我们不使用这个方法。

这道题的思路是,将字符串经过 ASCII 码排序之后作为key值存放在哈希表中,然后哈希表的value值是一个链表,用来存储同一组异位词,当遍历字符串的时候也是将该字符串进行 ASCII 码排序之后将这个字符串放入指定的key-value中。

5.3 Java代码实现

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for(String s : strs) {
        	//将字符串转换为字符数组之后进行排序,然后再转换为字符串
            char[] tmp = s.toCharArray();
            Arrays.sort(tmp);
            String key = new String(tmp);

			//如果哈希表中不存在key值,则需要先创建出key的List
            if (!map.containsKey(key)) {
                map.put(key, new ArrayList<String>());
            }
            //将该字符串添加进对应分组中
            map.get(key).add(s);
        }

        return new ArrayList(map.values());
    }
}

【算法系列篇】哈希表,算法,算法,散列表,数据结构文章来源地址https://www.toymoban.com/news/detail-712801.html

到了这里,关于【算法系列篇】哈希表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一篇就能学懂的散列表,让哈希表数据结构大放光彩

    目录 1.散列表的基本概念 2.散列表的查找 3.散列函数的构造方法 1.直接定址法 2.除留余数法 4.散列表解决冲突的方法 1.开放定址法 2.链地址法 基本思想 :记录的存储位置与之间存在的对应关系 对应关系——hash函数 Loc(i) = H(keyi) Hash:哈希——翻译为:散列、杂凑(感

    2024年02月09日
    浏览(46)
  • Map、Set和哈希表(数据结构系列14)

    目录 前言: 1.搜索树 1.1概念 1.2插入 1.3查找 1.4删除 1.5二叉搜索树整体代码展示  2. Map和Set的讲解 2.1 Map的说明 2.1.1Map的方法 2.2 Set 的说明 2.2.1Set的方法 3.哈希表 3.1哈希表的概念 3.2哈希冲突 3.3冲突的避免 3.4哈希冲突的解决 3.4.1闭散列 3.4.2开散列 结束语: 这节中小编主要与

    2024年02月07日
    浏览(29)
  • 【数据结构与算法】前缀和+哈希表算法

    关于前缀和和哈希这两个概念大家都不陌生,在之前的文章中也有过介绍:前缀和与差分算法详解 而哈希表最经典的一题莫过于 两数之和 题目链接 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它

    2024年02月01日
    浏览(104)
  • 【数据结构】哈希表(算法比赛向)

    目录 一:介绍 一:什么是哈希表 二、哈希表的应用 二:存储结构 a.拉链法: b.开放寻址法: 三:扩展 a.字符串哈希: 例题:      一:什么是哈希表 1、哈希表也叫散列表,哈希表是一种数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插

    2023年04月25日
    浏览(39)
  • 数据结构,查找算法(二分,分块,哈希)

    一、查找算法         1、二分查找:(前提条件: 必须有序的序列) 2、分块查找:(块间有序,块内无序)     索引表  +  源数据表     思路:     (1)先在索引表中确定在哪一块中     (2)再遍历这一块进行查找 //索引表 typedef  struct  {     int max; //块中最大值

    2024年02月11日
    浏览(46)
  • 【数据结构与算法】哈希—— 位图 | 布隆过滤器 | 哈希切割

    🐱作者:一只大喵咪1201 🐱专栏:《数据结构与算法》 🔥格言: 你只管努力,剩下的交给时间! 哈希是一种映射思想,这里再讲解两种应用哈希思想的数据结构。 问题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数

    2024年02月02日
    浏览(44)
  • C++数据结构与算法——哈希表

    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注! 给定两个字符串 s 和 t ,编写一个函数来判断

    2024年02月19日
    浏览(46)
  • 【数据结构与算法——TypeScript】哈希表

    哈希表介绍和特性 哈希表是一种非常重要的数据结构,但是很多学习编程的人一直搞不懂哈希表到底是如何实现的。 在这一章节中,我门就一点点来实现一个自己的哈希表。 通过实现来理解哈希表背后的原理和它的优势。 几乎所有的编程语言都有直接或者间接的应用这种数

    2024年02月13日
    浏览(32)
  • 数据结构与算法 | 哈希表(Hash Table)

    在二分搜索中提到了在有序集合中查询某个特定元素的时候,通过折半的方式进行搜索是一种很高效的算法。那能否根据特征直接定位元素,而非折半去查找?哈希表(Hash Table),也称为散列表,就是一种数据结构,用于实现键-值对的映射关系。它通过将键映射到特定的值

    2024年02月06日
    浏览(37)
  • 算法数据结构基础——哈希表(Hash Table)

    哈希表(Hash Table) :也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。 哈希表通过「键 key 」和「映射函数 Hash(key) 」计算出对应的「值 value 」,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包