两类查找问题:

1)查找有无:

- 某个元素是否存在,通常使用set(集合)

2)查找对应关系(键值对应)

- 某个元素出现了几次,map(字典)

set和map都不允许里面的键值重复。

常见操作:

- insert

- find

- erase

- change(map)

思路:把nums1放到一个set类型的record中,然后遍历nums2,若在record中找到了对应的元素就储存在另一个set类型的resultSet中。

  1. //时间复杂度: O(nlogn)
    //空间复杂度:O(n) 因为使用了额外的map来存储数据
  2. class Solution {
  3. public:
  4. vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
  5. /*
  6. set<int> record; //set对于重复的元素只记录一次
  7. for(int i=0; i<nums1.size();i++){
  8. record.insert(nums1[i]);
  9. }
  10. */ 
         //遍历一遍为n次,插入为logn,共O(nlogn)
  11. set<int> record(nums1.begin(), nums1.end());
  12. set<int> resultSet;
  13. //遍历一遍并查找加修改,O(nlogn)
  14. for(int i=;i<nums2.size();i++){
  15. if(record.find(nums2[i]) != record.end()) //若find找到的索引不等于record.end说明存在
  16. resultSet.insert(nums2[i]); //在record中找到了与nums2中相同的元素时,插入到resultSet
  17. }
  18.  
  19. /*
  20. vector<int> resultVector;
  21. //使用容器类的迭代器
  22.  
  23. for(set<int>::iterator iter=resultSet.begin(); iter!=resultSet.end(); iter++)
  24. resultVector.push_back(&iter);
  25.  
  26. result resultVector;
  27. */
  28. //创建vector为O(n) 级别的
  29. return vector<int>(resultSet.begin(), resultSet.end());
  30. }
  31. };

思路:键值对应的问题:当我们记录某一元素,也要记录它对应出现的次数。使用map来记录nums1中出现的元素及其对应的次数,然后遍历nums2, 若找到相同的元素,就保存在resultVecor里,并将record减1。

  1. class Solution {
  2. public:
  3. vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
  4. map<int, int> record;
  5. for(int i=; i<nums1.size();i++)
  6. record[nums1[i]] ++;
  7.  
  8. vector<int> resultVector;
  9. for(int i=;i<nums2.size();i++){
  10. if(record[nums2[i]]>){
  11. resultVector.push_back(nums2[i]);
  12. record[nums2[i]]--;
  13. }
  14. }
  15. return resultVector;
  16. }
  17. };

注意:int类型的map的会自动给没有赋值的元素一个初始值为0。一旦我们使用了实例中的某一键值,虽然这个键值之前不在map这个映射中,而我们只要访问一次,就为这个映射插入了这个元素,这个元素的值时默认值。

如果想要真正删除这个元素,需要调用 .erase()函数。

哈希表的缺点是失去了数据的顺序性。

故可以使用unordered_map来减少时间复杂度。

//349

  1. //时间复杂度: O(n)
  2. //空间复杂度:O(n) 因为使用了额外的map来存储数据
  3. class Solution {
  4. public:
  5. vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
  6. /*
  7. unordered_set<int> record; //set对于重复的元素只记录一次
  8. for(int i=0; i<nums1.size();i++){
  9. record.insert(nums1[i]);
  10. }
  11. */ 
  12.      //遍历一遍为n次,插入为O(1),共O(n)
  13. unordered_set<int> record(nums1.begin(), nums1.end());
  14. unordered_set<int> resultSet;
  15. //遍历一遍并查找加修改,O(n)
  16. for(int i=;i<nums2.size();i++){
  17. if(record.find(nums2[i]) != record.end()) //若find找到的索引不等于record.end说明存在
  18. resultSet.insert(nums2[i]); //在record中找到了与nums2中相同的元素时,插入到resultSet
  19. }
  20.  
  21. /*
  22. vector<int> resultVector;
  23. //使用容器类的迭代器
  24.  
  25. for(set<int>::iterator iter=resultSet.begin(); iter!=resultSet.end(); iter++)
  26. resultVector.push_back(&iter);
  27.  
  28. result resultVector;
  29. */
  30. //创建vector为O(n)
  31. return vector<int>(resultSet.begin(), resultSet.end());
  32. }
  33. };

查找表set和map 349, 350的更多相关文章

  1. Map 查找表操作

    package seday13; import java.util.HashMap; import java.util.Map; /** * @author xingsir * java.util.M ...

  2. JAVASE02-Unit05: 集合操作 —— 查找表

    Unit05: 集合操作 -- 查找表 使用该类测试自定义元素的集合排序 package day05; /** * 使用该类测试自定义元素的集合排序 * @author adminitartor * ...

  3. 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

    1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...

  4. 查找表,Two Sum,15. 3Sum,18. 4Sum,16 3Sum Closest,149 Max points on line

    Two Sum: 解法一:排序后使用双索引对撞:O(nlogn)+O(n) = O(nlogn) , 但是返回的是排序前的指针. 解法二:查找表.将所有元素放入查找表, 之后对于每一个元素a,查找 t ...

  5. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  6. OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时

    目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...

  7. Lua查找表元素过程(元表、__index方法是如何工作的)

    近日开始研究Lua,在元表的使用上照猫画虎地搞了两下,实现了“面向对象”,但究其本质却略有不解,后咨询牛哥得解,特此记录. Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Val ...

  8. Quarter square 查找表乘法器,手动建立rom

    建立一个C的范围为0~255,内容是(C)2/4的查表 占用256个存储空间,但可以计算出+-127的两个数之积.传统算法需要至少127×127个存储空间. 查找表模块的建立: module lut_ ...

  9. 数据结构算法C语言实现(三十二)--- 9.1静态查找表

    一.简述 静态查找表又分为顺序表.有序表.静态树表和索引表.以下只是算法的简单实现及测试,不涉及性能分析. 二.头文件 /** author:zhaoyu date:2016-7-12 */ #inc ...

随机推荐

  1. MAT(Memory Analyzer tool)使用

    当线上环境出现OOM/内存泄漏了,怎么办? 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,配置-XX:+HeapDumpOnOutOfMemoryError, 当出现OOM时,分析dum ...

  2. SqlServer try catch 捕获不到的一些错误及解决方法

    IF (OBJECT_ID('AA','U') IS NOT NULL) DROP TABLE AA CREATE TABLE AA(ID INT) SELECT * FROM AA --注:数据库当 ...

  3. AutoHotKey 使用ADODB读取Excel 报ADODB.Connection 未找到提供程序,可能未提供

    一.系统环境 操作系统:Win7 64位 英文版 Office:     Office 2010 64位/32位 AutoHotKey:AutoHotKey 1.1.26.01 二.问题现象 安装了A ...

  4. webservice CXF 相关面试题

    Web Service的优点(1) 可以让异构的程序相互访问(跨平台)(2) 松耦合(3) 基于标准协议(通用语言,允许其他程序访问) 1:WEB SERVICE名词解释.JSWDL开发包的介绍.JA ...

  5. GNU 和 g++(转)

    百度知道 GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统.Richard Stallman最早是在net.unix ...

  6. 13.JOIN

    SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据 CREATE TABLE IF NOT EXISTS zz0 (number INT(11)); CREATE TABLE ...

  7. Python3 BeautifulSoup和Pyquery解析库随笔

    BeautifuSoup和Pyquery解析库方法比较 1.对象初始化: BeautifySoup库: from bs4 import BeautifulSoup html = 'html strin ...

  8. python字符串大小写转换

    str = "www.w3cSChool.cn"print(str.upper()) # 把所有字符中的小写字母转换成大写字母print(str.lower()) # 把所有字符中 ...

  9. Sharepoint2013搜索学习笔记之自定义结果精简分类(八)

    搜索结果页左边的结果精简分类是可以根据搜索结果自定义的,在搜索的部门日志结果集页面上我搜索测试关键字,左边分类导航在默认分类的基础上增加了一个日志类型的分类,如下图: 要实现这个效果,导航到之前定义的 ...

  10. C#英文面试常见问题[转]

    I was reading a post about some common C# interview questions, and thought I'd share some of mine. T ...