[hashmap|空间换时间] leetcode 1 两数之和

1.题目

题目链接
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

2.分析

2.1.第一印象

第一眼的想法为“暴力求解”,即利用两层for循环遍历数组,判断是否有满足条件的数对:

vector<int> twoSum(vector<int>& nums, int target) {vector<int> res;for(int i = 0; i < nums.size(); i++) {for(int j = i + 1; j < nums.size(); j++) {if(nums[i] + nums[j] == target){res.push_back(i);res.push_back(j);return res;}}}return res;
}

时间复杂度为O(n2)。能否在此基础上进行改进?

2.2.HashMap

HashMap存储着key-value键值对,一个显著的优势是能够将查找的时间复杂度降为O(1)
那么本题可以这么理解:对于当前遍历到的数a,只需要判断target - a是否在数组中即可。
此时key就是nums数组中第i个数的值,value就是数组中第i个数的下标(也就是i)。也就是说,同样是寻找一个数,通过构造一个反向的从值到下标的映射,可以压缩查找的时间。
原: 使用内层for循环来判断另一个数是否满足要求

for(int i = 0; i < nums.size(); i++) {for(int j = i + 1; j < nums.size(); j++) {//do something...}
}

改: 使用内层if来以O(1)的时间复杂度判断另一个数是否满足要求

for(int i = 0; i < nums.size(); i++) {if(map.find(target - nums[i] != map.end())) {//do something...}
}

修改后的代码便实现了所谓的空间换时间:用hashmap的 O(n) 的存储效率换取了 O(1) 的查找效率。

3.代码

C++中hashmap以unordered_map的形式实现。

class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> m;for(int i = 0; i < nums.size(); i++) {if(m.find(target-nums[i]) != m.end()) {return {m[target-nums[i]], i};  }              m[nums[i]] = i;      }return {};}
};

[hashmap|空间换时间] leetcode 1 两数之和相关推荐

  1. [leetcode]1.两数之和

    [leetcode]1.两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应 ...

  2. C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组

    C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...

  3. LeetCode 1. 两数之和

    LeetCode 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入 ...

  4. 力扣(leetcode)-1. 两数之和

    描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组 ...

  5. LeetCode 01两数之和02两数相加

    力扣 LeetCode01两数之和 LeetCode02两数之加 前言:第一次LeetCode打卡题解,前面组织的打卡活动从今天开始正式开始了,很多csdn和公众号小伙伴以及加入了,欢迎加入!详细看力 ...

  6. leetCode:twoSum 两数之和 【JAVA实现】

    LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...

  7. 【LeetCode】两数之和

    package leetcode.editor.cn;//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. // // 你可 ...

  8. leetcode算法—两数之和 Two Sum

    关注微信公众号:CodingTechWork,一起学习进步. 题目 Two Sum: Given an array of integers, return indices of the two num ...

  9. 【LeetCode】两数之和、三数之和、四数之和系列

    文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...

最新文章

  1. Go 学习笔记(30)— Go 语言 make 和 new 的区别
  2. asp遍历前端的所有控件
  3. creo扫描选择多条链作为轨迹_ProE/Creo圆轨迹可变扫描法创建弧顶面,用上便爱上(一)...
  4. 如何打印出给定尺寸的方格_打印给定号码的表格| 8086微处理器
  5. [转载] python数学编程书推荐_图书推荐:《Python数学编程》
  6. mysql数据库过滤数据_MySQL数据库常规操作一些简单绕过过滤的方法
  7. 跨时代比较:工业化因素是关键
  8. 宝塔面板 服务器状态,宝塔面板中重启腾讯云服务器后无法登录宝塔面板怎么办?...
  9. B站视频解析去水印工具入口
  10. python爬虫项目(对博思平台社区话题信息进行爬取并保存)
  11. 代理IP 有效性检测
  12. 课题:修改ssh的访问端口
  13. python3d_Power BI将超越python和D3,成为数据可视化的福音、定性数据分析的未来?...
  14. python正则表达式编译_用Python编译正则表达式
  15. 【C++】虚函数与虚函数表
  16. A Personality traits and job candidate screening via analyzing facial videos 阅读笔记
  17. NDK开发(四):仿QQ变声
  18. 国家统计局固定资产投资统计
  19. 野火i.MX6ULL Pro开发板构建根文件系统
  20. 如何查询计算机记录表,如何查看电脑使用记录

热门文章

  1. python字符串(in 和not in)(一分钟读懂)
  2. java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令
  3. stream流常用方法_Java8 中用法优雅的 Stream,怪不得我之前总是看不懂别人写的代码!...
  4. mysql库表的触发器表名_MySQL 触发器,实现不同数据库,不同表名,表结构不同,数据实时同步...
  5. 大工20春《计算机应用基础》在线测试,大工20春《计算机应用基础》在线测试1答案...
  6. LeetCode Week 4:第 31 ~ 40 题
  7. 201912-4 区块链(CCF CSP认证)
  8. ORB-SLMA3的学习笔记
  9. BasicAuth和OAuth
  10. 机器学习-多元梯度下降