【优选算法专栏】专题十:哈希表(一)

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

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:算法从入门到精通
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

哈希表简介

在介绍本专题前,我们先介绍一下什么是哈希表

哈希表就是一个容器,它的用途就是可以快速查找元素,它的时间复杂度是O(1)级别,空间复杂度就是O(N)也就是用空间换时间。

什么时候用哈希表?

介绍了什么是哈希表,那么什么时候可以用哈希表?
记住一点,当我们要频繁的进行查找某一个数的时候,这时候我们就可以考虑用哈希表。当然提到查找也不要忘了我们之前学过的二分算法,也可用来查找元素。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++

怎么用哈希表?

提到怎么用,通常情况下容器里面的哈希表我们可以直接拿来用,其次就是我们可以用一个数组来模拟哈希表。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++
通常会用在两个场景,一是在处理字符串中的字符的时候,我们可以用数组来建议模拟哈希表,方便做到快速查找。
其次当数据量很小的时候,我们也可以直接考虑用数组来模拟哈希表。

面试题 01.02. 判定是否互为字符重排

题目来源:Leetcode面试题 01.02. 判定是否互为字符重排
给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++

算法原理:

在判断字符重不重排,首先我们要先判断这两个字符串的长度是否一致,长度都不一致,肯定无法重排。

判断两个字符串能否构成重排,最暴力就是直接仍在两个哈希表里,然后判断这两个哈希表是否相等,但是这样太麻烦了。
我们可以进行优化,用数组模拟哈希表,因为全都是小写字母,那么我们直接开一个大小为26的一个字符数组。

遍历第一个数组,碰到一个字母就对应++,然后遍历第二个数组,碰到对应字符数组中字母相同就对应–。同时,判断数组下标,如果说下标<0了,那就说明,该字符在第一个数组中就不存在,不能构成重排。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++

代码实现:文章来源地址https://www.toymoban.com/news/detail-850120.html

class Solution 
{
public:
    bool CheckPermutation(string s1, string s2) 
    {
        int n=s1.size(),m=s2.size();
        if(n!=m)
            return false;
        
        char hash[26];
        //遍历第一个数组
        for(auto S1:s1)
        {
            hash[S1-'a']++;
        }
        //遍历第二个数组
        for(auto S2:s2)
        {
            hash[S2-'a']--;
            if(hash[S2-'a']<0)
                return false;
        }
        return true;
    }
};

存在重复元素

题目来源:Leetcode217存在重复元素
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++

算法原理:

解法用哈希表,
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++
固定1位置,看1位置前面有没用相同元素,没有就继续向后移动,看2位置前面有没有相同元素,没有就继续向后移动,依次内推。

代码实现

class Solution 
{
public:
    bool containsDuplicate(vector<int>& nums) 
    {
        unordered_set<int> hash;
        for(auto x:nums)
        {
            //存在相同元素
            if(hash.count(x))
            return true;
            else
            hash.insert(x);

        }
        return false;
    }
};

存在重复元素 II

题目来源:Leetcode219存在重复元素 II
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++

算法原理:

本题跟上一题的思路基本一样,但是本题要保证两个相同元素的下标差的绝对值要小于K。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++
哈希表里面第一个存nums[i]用来判断有没有重复元素,第二个存对应的下标。因为要判断下标关系是否符合要求。跟第一题私立基本一样,固定一个数,看前面有没有重复元素。
没有就向右移动。

代码实现:

class Solution 
{
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) 
    {
        unordered_map<int,int> hash;
        for(int i=0;i<nums.size();i++)
        {
            if(hash.count(nums[i]))
            {
                if(i-hash[nums[i]]<=k)
                return true;
            }
            //找不到把当前下标插入到哈希表里面
            hash[nums[i]]=i;
        }
        return false;
    }
};

字母异位词分组

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

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

【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++

算法原理:

先把题目例子分析一遍,可以将例子进行分组。
最后把每个组输出即可。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++

  1. 那么如何判断两个字符串是否是字母异位词呢?
    这里我们可以排序,我们将字符串排完序,如果可以字母异位,那么他们排完序后的ASLL码值肯定都是一样的。

2.如何进行分组?
这里我们就要合理用我们的哈希表。
我们将key定义为string,将val定义为字符串数组。
【优选算法专栏】专题十:哈希表(一),算法专栏,# 优选算法专栏,算法,散列表,数据结构,c++
遍历字符串数组,遍历第一个字符排序,然后看在不在哈希表,不在就加入到key,和val,然后遍历第二个字符串,排完序,看跟哈希表里面key匹不匹配,匹配就加入到val,循环此过程,遍历完整个字符串数组后,把哈希表里面的val全部取出来即可。

代码实现:

class Solution 
{
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) 
    {
        unordered_map<string,vector<string>> hash;
        //1.把所有的异位字母词分组
        for(auto & s:strs)
        {
            string tmp=s;
            sort(tmp.begin(),tmp.end());
            hash[tmp].push_back(s);
        }
        //2.提取结果
        vector<vector<string>> ret;
        for(auto &[x,y]: hash)
        {
            ret.push_back(y);
        }
        return ret;
    }
};

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

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

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

相关文章

  • 【数据结构与算法】04 哈希表 / 散列表 (哈希函数、哈希冲突、链地址法、开放地址法、SHA256)

    一种很好用,很高效,又一学就会的数据结构,你确定不看看? 莫慌,每个概念都很好理解。 哈希表( Hash Table ),也称为 散列表 ,是一种数据结构, 用于存储键值对(key-value pairs) 。 键值对是一种数据结构,用于将键(key)与对应的值(value)相关联。在键值对中,键

    2024年02月09日
    浏览(63)
  • 哈希表-散列表数据结构

    哈希表也叫散列表,哈希表是根据关键码值(key value)来直接访问的一种数据结构,也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度,这种映射关系称之为哈希函数或者散列函数,存放记录的数组称之为哈希表。 哈希表采用的是一种转换思

    2024年01月21日
    浏览(43)
  • 【数据结构(C++版)】哈希表(散列表)

    目录   1. 散列表的概念 2. 散列函数的构造方法 2.1 直接定址法 2.2 除留余数法 2.3 数字分析法 2.4 平方取中法 3. 处理冲突的方法 3.1 开放定址法 3.1.1 线性探测法 3.1.2 平方探测法 3.1.3 双散列法 3.1.4 伪随机序列法 3.2 拉链法(链接法) 4. 散列查找及性能分析 5. 哈希的应用 5.1 位

    2024年02月15日
    浏览(38)
  • 【算法优选】 二分查找专题——壹

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用 顺序存储结构 ,而且表中元素按 有序排列 。 查找过程 : 首先,假设表中元素是按升序排列,将表中间位置记录的与查找比较,如果两者相等,

    2024年02月08日
    浏览(33)
  • 【算法优选】 二分查找专题——贰

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用 顺序存储结构 ,而且表中元素按 有序排列 。 查找过程 : 首先,假设表中元素是按升序排列,将表中间位置记录的与查找比较,如果两者相等,

    2024年02月08日
    浏览(32)
  • 【算法优选】 滑动窗口专题——贰

    基本概念 滑动窗口是一种 基于双指针 的一种思想,两个指针指向的元素之间形成一个窗口。 分类:窗口有两类,一种是 固定大小类 的窗口,一类是 大小动态变化 的窗口。 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fru

    2024年02月08日
    浏览(39)
  • 【算法优选】前缀和专题——叁

    含义 : 前缀和实际上就是对于长度为n的数组, 我们新建立一个数组长度为n+1,第i个元素的值为前i个元素的和(包括第i个元素) 。 特点 : 前缀和数组比原数组多一个长度。 前缀和的第0个元素的值为0。 根据前缀和数组的特点,求前缀和时。我们只需要用第i个元素的值

    2024年02月06日
    浏览(39)
  • 【算法优选】 前缀和专题——壹

    含义 : 前缀和实际上就是对于长度为n的数组, 我们新建立一个数组长度为n+1,第i个元素的值为前i个元素的和(包括第i个元素) 。 特点 : 前缀和数组比原数组多一个长度。 前缀和的第0个元素的值为0。 根据前缀和数组的特点,求前缀和时。我们只需要用第i个元素的值

    2024年02月08日
    浏览(29)
  • 【算法优选】 滑动窗口专题——壹

    基本概念 滑动窗口是一种 基于双指针 的一种思想,两个指针指向的元素之间形成一个窗口。 分类:窗口有两类,一种是 固定大小类 的窗口,一类是 大小动态变化 的窗口。 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长

    2024年02月08日
    浏览(30)
  • 【算法优选】双指针专题——叁

    常⻅的双指针有两种形式,⼀种是 对撞指针 ,⼀种是 左右指针 对撞指针 :⼀般⽤于顺序结构中,也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。 对撞指针的终⽌条件⼀般是两个指针相遇或者错开(也可能

    2024年02月08日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包