代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和

这篇具有很好参考价值的文章主要介绍了代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈希表理论基础

当需要判断一个元素是否在一个集合中,哈希表的时间复杂度只有O(1)。

哈希表有一个映射的操作,当映射的元素在同一个索引下标的位置,就会引发哈希碰撞

哈希碰撞的两种解决方法:拉链法

代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和

线性探测法 

代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和

 同时,哈希表还有常见的三种数据结构:分别是数组、集合set、映射map。

有效的字母异位词

这道题目有效考察了数组在哈希表中的应用

代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和

这道题的思路是定义一个数组,用来记录字符串t和s在数组中字符出现的次数。比如说字符串s中有a出现,数组0号位置就加一,数组t中有a出现,数组0号位置就减一,这样一来到最后,如果数组中所有的元素都是0,就可以知道这两个字符串是异位词。

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for(int i = 0;i < s.size();i++)
        {
            record[s[i] - 'a']++;
        }
        for(int i = 0;i < t.size();i++)
        {
            record[t[i] - 'a']--;
        }
        for(int i = 0;i < 26;i++)
        {
            if(record[i] != 0)
            {
                return false;
            }
        }
        return true;
    }
};

关于这里面record[s[i]-'a']++,比如说这里的s是rat,当i等于0时候,那么也就是record['r'-'a']++,'r'-'a'的相对位置就可以换成r在数组是第几个元素,这样'a'-’a'相对位置就是0,‘b'-’a'相对位置就是1,以此类推。

两个数组的交集

这道题主要是哈希表的set结构来处理问题的,因为返回的结构中是无序并且是单一的,因此我们可以选取unordered_set这种数据结构,我们设置一个result_set用来存放结果,然后将num1变成一个哈希表,我们将nums2中的数组进行比对,也就是看看nums2中的数据有没有在nums1中这个哈希表中有没有出现过,如果有的话,就将结果更新到result_set中去。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;
        unordered_set<int> nums_set(nums1.begin(),nums1.end());
        for(int num : nums2)
        {
            if(nums_set.find(num) != nums_set.end())
            {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(),result_set.end());
    }
};

其中for(int num :num2)是C++11标准的写法,后面的话这些知识需要补上。

快乐数

这道题说到底就是一道哈希表的应用

代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和主要思想是看那个无限循环,n的每个位置上的平方和都是一次sum,然后再次将sum变成n继续获得每个位置上的平方和,把每次获得的sum放在一个容器中,如果容器中有这个数了,那么就说明进入了无限循环,发现为1的话就说明结果走出了。

class Solution {
public:
    int getSum(int n)//先获得n各个位上的平方和
    {
        int sum = 0;
        while(n)
        {
            sum += (n%10)*(n%10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> set;
        while(1)
        {
            int sum = getSum(n);
            if(sum == 1)
            {
                return true;
            }
            if(set.find(sum) != set.end())
            {
                return false;
            }else{
                set.insert(sum);
            }
            n = sum;
        }
    }
};

 两数之和

代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和

 这道题需要我们的思维是先拿到一个元素,然后在数组中找另外一个元素和它相加等于目标值,依此遍历数组,哈希表的思想就是查询一个元素是否出现过,这道题可以使用哈希表的map来解题。因为我们需要存放元素的值还需要存放元素的下标,因此使用哈希表是最好的方法。文章来源地址https://www.toymoban.com/news/detail-456930.html

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int> map;
        for(int i = 0;i < nums.size();i++)
        {
            auto iter = map.find(target - nums[i]);
            if(iter != map.end())
            {
                return {iter->second,i};
            }
            else
            {
                map.insert(pair<int,int> (nums[i],i));
            }
        }
        return {};
    }
};

到了这里,关于代码随想录day6|哈希表理论基础、有效的字母异位词、两个数组的交集、快乐数、两数之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 代码随想录刷题day6

    242.有效的字母异位词 用数组实现哈希; 注意初始化; int storage[26] = {0}; //定义数组的方法:  数据类型  数组名[数组长度]; 这时候index从 0 - 25;注意要初始化这个数组,不初始化会报错 349. 两个数组的交集 用unoderset来实现哈希,注意unorderset容器内部直接就做了去重操作 要

    2024年02月03日
    浏览(38)
  • 代码随想录day3|链表理论基础、移除链表元素、设计链表、翻转链表

    1、基本类型:单链表、双链表、循环链表 2、存储方式:和数组不一样,链表是随机存储在内存中,不是连续分配在内存中。 3、链表的定义: 定义了一个数据域,还有一个指针域,并且定义了一个构造函数。 4、链表的操作: 删除节点:  在图中,若需要删除D这个节点,只

    2024年02月05日
    浏览(33)
  • 代码随想录Day3|链表理论基础|203.移除链表元素|707.设计链表|206.反转链表

    虽然以前写过一次链表,但是真的已经忘得一干二净了 链表 :通过 指针 串联在一起的线性结构,每个 节点 都由数据域和指针域组成。 指针域 :存放下一个节点的指针,最后一个节点的指针域指向null,也即空指针 head :链表的入口节点,也即链表的头节点 链表的类型 单

    2024年02月11日
    浏览(42)
  • Day7代码随想录(1刷) 哈希表

    目录 454. 四数相加 II  383. 赎金信 15. 三数之和  18. 四数之和   给你四个整数数组  nums1 、 nums2 、 nums3  和  nums4  ,数组长度都是  n  ,请你计算有多少个元组  (i, j, k, l)  能满足: 0 = i, j, k, l n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 示例 1: 示例 2:    提示: n == nums1.l

    2024年03月25日
    浏览(37)
  • 代码随想录第6天| 哈希表理论基础 ,LeetCode242.有效的字母异位词,LeetCode349. 两个数组的交集,LeetCode202. 快乐数,LeetCode1. 两数之和

    哈希表(散列表)理论基础 : 哈希表是根据关键码的值而直接进行访问的数据结构。 直白来讲其实数组就是一张哈希表。   什么时候想到用哈希法, 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法 。 当我们遇到了要快速判断一个元素是否出现集

    2024年02月10日
    浏览(40)
  • 代码随想录二刷 day06 | 哈希表之 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

    哈希表能解决什么问题呢?一般哈希表都是用来快速判断一个元素是否出现集合里。 242.有效的字母异位词 题目链接 解题思路: 题目的意思就是 判断两个字符串是否由相同字母组成。 字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。

    2024年02月07日
    浏览(35)
  • 代码随想录第44天|动态规划:完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ

    代码随想录 (programmercarl.com) 动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件 。 完全背包中的物品可以添加多次,所以要从小到大遍历: 518. 零钱兑换

    2024年04月25日
    浏览(32)
  • 代码随想录打卡—day41—【DP】— 8.26+27 DP基础3

    343. 整数拆分 一开始做 没有思路,学习了题解才,ac代码: 后来仔细看题解,其实 for - j 的次数可以优化—— 注意 枚举j的时候,是从1开始的。从0开始的话,那么让拆分一个数拆个0,求最大乘积就没有意义了。 优化1: j 的结束条件是 j i - 1 ,其实 j i 也是可以的,不过

    2024年02月11日
    浏览(27)
  • 代码随想录 -- 哈希表--两数之和

    力扣hot1:两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] +

    2024年02月09日
    浏览(29)
  • 第10天-代码随想录刷题训练-第五章 栈和队列- ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈

    栈和队列对应的三个不同的STL版本,底层实现方式不一样, 为我们所知道的是 SGI STL 栈 栈提供 pop和push等接口, 不提供走访功能 也不提供迭代器, 不像map和set可以使用迭代器遍历,往往不被归类为容器,而是容器适配器 栈的内部实现结构可以使用 verctor、list 和 deque(默认)

    2024年02月04日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包