首页 > 编程语言 >代码随想录算法训练营第6天 | 哈希表

代码随想录算法训练营第6天 | 哈希表

时间:2024-03-29 21:15:28浏览次数:35  
标签:map set nums int 训练营 随想录 哈希 sum

哈希表理论基础

  • 用法:一般哈希表都是用来快速判断一个元素是否出现集合里,哈希法牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找
    eg:例如要查询一个名字是否在这所学校里,要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到
  • 哈希碰撞的两种冲突解决方法
    • 拉链法:链表
    • 线性探测法:向后顺延(哈希表的tablesize > datasize)
  • 三种哈希结构
    • 数组
    • set 集合
    • map 映射

242有效的字母异位词(哈希——数组)

根据字母直接映射到相应位置

bool isAnagram(string s, string t) {
        if(s.length()!=t.length())
        return false;
        vector<int> v(26,0);
        for(int i=0;i<s.length();i++){
            v[s[i]-'a']++;
            v[t[i]-'a']--;
        }
        for(int j=0;j<26;j++)
        if(v[j]!=0)
        return false;
        return true;
    }

349两个数组的交集(哈希-set)

nums={0,1,1000000},若用数组,则需要开规模为1000001的空间,造成极大浪费
unordered_set的用法

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 i = 0; i < nums2.size(); i++) {
        if (nums_set.find(nums2[i]) != nums_set.end())
            result_set.insert(nums2[i]);
    }
    return vector<int>(result_set.begin(), result_set.end());
}

202快乐数(哈希-set)

int getSum(int n) {
	int sum = 0;
	while (n)
	{
		sum += (n % 10) * (n % 10);
		n = n / 10;
	}
	return sum;
}

bool isHappy(int n) {
	unordered_set<int> set;
	int sum = n;
	while (1)
	{
		sum = getSum(sum);
		if (sum == 1)
			return true;
		if (set.find(sum) != set.end())
			return false;
		else
			set.insert(sum);		
	}
}

1两数之和(哈希-map(key,value))

查找一个元素target-x(key)是否出现过,并且找出它的下标(value)

vector<int> twoSum(vector<int>& nums, int target) {
	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 {};
}

标签:map,set,nums,int,训练营,随想录,哈希,sum
From: https://www.cnblogs.com/ddup-cpp/p/18102821

相关文章

  • 代码随想录算法训练营第六十天 | 84.柱状图中最大的矩形
      84.柱状图中最大的矩形 已解答困难 相关标签相关企业 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1:输入:heights=[2,1,5,6,2,3]输出:10......
  • 代码随想录算法训练营第二十四天(回溯1)|77. 组合(JAVA)
    文章目录回溯理论基础概念类型回溯模板77.组合解题思路源码回溯理论基础概念回溯是递归的副产品,本质上是一种穷举回溯解决的问题可以抽象为一种树形结构类型回溯主要用来解决以下问题组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定......
  • 代码随想录算法训练营第二十三天(二叉树9)|669. 修剪二叉搜索树、108. 将有序数组转换为
    文章目录669.修剪二叉搜索树解题思路源码108.将有序数组转换为二叉搜索树解题思路源码538.把二叉搜索树转换为累加树解题思路源码669.修剪二叉搜索树给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值......
  • 代码随想录算法训练营第五十九天 | 42. 接雨水,503下一个更大元素
    503.下一个更大元素II 已解答中等 相关标签相关企业 给定一个循环数组 nums ( nums[nums.length-1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的......
  • 我做【网创导师训练营】项目,从0开始做,3个月就做到月入10万+,现在手把手复制给你
    一、开门见山,先公开一下我自己操作的收益大家好!我是如今,【如今笔记】的主理人。今天给大家带来的项目是:网创导师训练营。我是从0开始做的这个项目,三个月的时间,我做到了月收益10万以上,而且现在每月的收益都还在增加。 这个项目比较简单,不需要你有很多的设备,一台手机+一台电......
  • 数据结构与算法 哈希表(散列表)
    1.哈希表的引出因此,散列表的时间复杂度O(1)。当我们需要在数组里查找一个数时,就可以考虑到使用哈希表来降低时间复杂度了。2.哈希表的应用3.哈希表发生冲突时4.哈希表的性能所以,我们需要尽可能地高的填装因子和一个良好的散列函数,才能提高哈希表的性能。......
  • 10天【代码随想录算法训练营34期】 第五章 栈与队列part01(● 232.用栈实现队列 ● 22
    232.用栈实现队列classMyQueue:def__init__(self):self.queue=[]self.size=0defpush(self,x:int)->None:self.queue.append(x)self.size+=1defpop(self)->int:self.size-=1retur......
  • 什么是redis中的哈希桶、哈希冲突及解决方法
    什么是哈希桶Redis中的哈希桶是一种数据结构,用于在Redis的哈希表(如字典结构)中存储键值对。哈希桶是哈希表数组中的每个元素,可以视为一个容器或槽位,用于存放数据。在Redis中,当插入一个新的键值对时,会根据键的哈希值计算出一个索引,该索引指向特定的哈希桶。每个哈希桶可以存储多个......
  • 树哈希学习笔记
    1.作用判断一些树是否同构。2.方法2.1.具体操作这类方法需要一个多重集的哈希函数。以某个结点为根的子树的哈希值,就是以它的所有儿子为根的子树的哈希值构成的多重集的哈希值,即:\[h_u=f(\{h_v|v\inson(u)\})\]其中\(h_x\)表示以\(x\)为根的子树的哈希值,\(f\)是多重集的......
  • 代码随想录学习Day 20
    669.修剪二叉搜索树题目链接讲解链接思路:采用递归方法,若root.val>high,判断左子树是否为空,若不空,递归遍历左子树,若空就返回null;若root.val<low,则判断右子树是否为空,若不空就递归遍历右子树,若空就返回null;如果low<=root.val<=high,就递归遍历左右子树,最后返回根节点即......