查找表set和map 349, 350
两类查找问题:
1)查找有无:
- 某个元素是否存在,通常使用set(集合)
2)查找对应关系(键值对应)
- 某个元素出现了几次,map(字典)
set和map都不允许里面的键值重复。
常见操作:
- insert
- find
- erase
- change(map)
思路:把nums1放到一个set类型的record中,然后遍历nums2,若在record中找到了对应的元素就储存在另一个set类型的resultSet中。
//时间复杂度: O(nlogn)
//空间复杂度:O(n) 因为使用了额外的map来存储数据
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
/*
set<int> record; //set对于重复的元素只记录一次
for(int i=0; i<nums1.size();i++){
record.insert(nums1[i]);
}
*/
//遍历一遍为n次,插入为logn,共O(nlogn)
set<int> record(nums1.begin(), nums1.end());
set<int> resultSet;
//遍历一遍并查找加修改,O(nlogn)
for(int i=;i<nums2.size();i++){
if(record.find(nums2[i]) != record.end()) //若find找到的索引不等于record.end说明存在
resultSet.insert(nums2[i]); //在record中找到了与nums2中相同的元素时,插入到resultSet
} /*
vector<int> resultVector;
//使用容器类的迭代器 for(set<int>::iterator iter=resultSet.begin(); iter!=resultSet.end(); iter++)
resultVector.push_back(&iter); result resultVector;
*/
//创建vector为O(n) 级别的
return vector<int>(resultSet.begin(), resultSet.end());
}
};
思路:键值对应的问题:当我们记录某一元素,也要记录它对应出现的次数。使用map来记录nums1中出现的元素及其对应的次数,然后遍历nums2, 若找到相同的元素,就保存在resultVecor里,并将record减1。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
map<int, int> record;
for(int i=; i<nums1.size();i++)
record[nums1[i]] ++; vector<int> resultVector;
for(int i=;i<nums2.size();i++){
if(record[nums2[i]]>){
resultVector.push_back(nums2[i]);
record[nums2[i]]--;
}
}
return resultVector;
}
};
注意:int类型的map的会自动给没有赋值的元素一个初始值为0。一旦我们使用了实例中的某一键值,虽然这个键值之前不在map这个映射中,而我们只要访问一次,就为这个映射插入了这个元素,这个元素的值时默认值。
如果想要真正删除这个元素,需要调用 .erase()函数。
哈希表的缺点是失去了数据的顺序性。
故可以使用unordered_map来减少时间复杂度。
//349
//时间复杂度: O(n)
//空间复杂度:O(n) 因为使用了额外的map来存储数据
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
/*
unordered_set<int> record; //set对于重复的元素只记录一次
for(int i=0; i<nums1.size();i++){
record.insert(nums1[i]);
}
*/
//遍历一遍为n次,插入为O(1),共O(n)
unordered_set<int> record(nums1.begin(), nums1.end());
unordered_set<int> resultSet;
//遍历一遍并查找加修改,O(n)
for(int i=;i<nums2.size();i++){
if(record.find(nums2[i]) != record.end()) //若find找到的索引不等于record.end说明存在
resultSet.insert(nums2[i]); //在record中找到了与nums2中相同的元素时,插入到resultSet
} /*
vector<int> resultVector;
//使用容器类的迭代器 for(set<int>::iterator iter=resultSet.begin(); iter!=resultSet.end(); iter++)
resultVector.push_back(&iter); result resultVector;
*/
//创建vector为O(n)
return vector<int>(resultSet.begin(), resultSet.end());
}
};
查找表set和map 349, 350的更多相关文章
- Map 查找表操作
package seday13; import java.util.HashMap; import java.util.Map; /** * @author xingsir * java.util.M ...
- JAVASE02-Unit05: 集合操作 —— 查找表
Unit05: 集合操作 -- 查找表 使用该类测试自定义元素的集合排序 package day05; /** * 使用该类测试自定义元素的集合排序 * @author adminitartor * ...
- 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨
1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...
- 查找表,Two Sum,15. 3Sum,18. 4Sum,16 3Sum Closest,149 Max points on line
Two Sum: 解法一:排序后使用双索引对撞:O(nlogn)+O(n) = O(nlogn) , 但是返回的是排序前的指针. 解法二:查找表.将所有元素放入查找表, 之后对于每一个元素a,查找 t ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时
目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...
- Lua查找表元素过程(元表、__index方法是如何工作的)
近日开始研究Lua,在元表的使用上照猫画虎地搞了两下,实现了“面向对象”,但究其本质却略有不解,后咨询牛哥得解,特此记录. Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Val ...
- Quarter square 查找表乘法器,手动建立rom
建立一个C的范围为0~255,内容是(C)2/4的查表 占用256个存储空间,但可以计算出+-127的两个数之积.传统算法需要至少127×127个存储空间. 查找表模块的建立: module lut_ ...
- 数据结构算法C语言实现(三十二)--- 9.1静态查找表
一.简述 静态查找表又分为顺序表.有序表.静态树表和索引表.以下只是算法的简单实现及测试,不涉及性能分析. 二.头文件 /** author:zhaoyu date:2016-7-12 */ #inc ...
随机推荐
- 如果你的资源贫乏,那么专注做好一件事将是你的唯一出路(no reading yet)
http://www.jianshu.com/p/8784f0fd7ab8/comments/1161511
- Part8-不用内存怎么行_6410内存初始化lesson3
1.6410地址空间 外设区:从0x70000000-0x7FFFFFFF有256MB 主存储区:从0x00000000-0x6FFFFFFF有1972MB 对于主存储区: 静态存储区可以接我们的NO ...
- 防止SQL注入方法总结
一.参数化SQL 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@来表示参数. 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为 ...
- Redesign Your App for iOS 7 之 页面布局【转】
前言 iOS7是目前iOS史上最颠覆的一次改版. 它的出现令人兴奋,因为它将会带我们进入一个全新的时代: 它的到来也让我们忧心,因为它颠覆了一切,包括我们过去做过的很多努力. 但是,相信大家乐意为这个 ...
- Python htmlTestRunner生成测试报告Demo
#该代码段是ReadTxt_demo.py 的代码,用户读取txt 文件中的用户信息. #ReadTxt_demo.py def readTxt(filePath): fo = open(filePa ...
- LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...
- MongoDB整理笔记の减少节点
当应用的压力小时,可以减少一些节点来减少硬件资源的成本:总之这是一个长期且持续的工作. 下面将刚刚添加的两个新节点28013 和28014 从复制集中去除掉,只需执行rs.remove 指令就可以了, ...
- 新建项目下的web文件夹下的dynamic web project和static web project和web fragment project的区别
dynamic web project是Eclipse的项目,与其对应的有static web project,前者指动态web项目,包含一些动态代码,如java:而static web projec ...
- git Problem with the SSL CA cert (path? access rights?)
问题: [root@localhost opt]# git clone https://github.com/docker/docker.git 正克隆到 'docker'...fatal: unab ...
- Kubernetes 集群部署(4) -- Node 部署
以下无特殊说明,都是在 Node 节点运行 1. 创建文件 vim /opt/k8s/cfg/kubelet.conf,内容如下: KUBELET_OPTS="--logtostderr=t ...