[hashmap|空间换时间] leetcode 1 两数之和
[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 两数之和相关推荐
- [leetcode]1.两数之和
[leetcode]1.两数之和 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应 ...
- C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组
C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...
- LeetCode 1. 两数之和
LeetCode 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入 ...
- 力扣(leetcode)-1. 两数之和
描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组 ...
- LeetCode 01两数之和02两数相加
力扣 LeetCode01两数之和 LeetCode02两数之加 前言:第一次LeetCode打卡题解,前面组织的打卡活动从今天开始正式开始了,很多csdn和公众号小伙伴以及加入了,欢迎加入!详细看力 ...
- leetCode:twoSum 两数之和 【JAVA实现】
LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...
- 【LeetCode】两数之和
package leetcode.editor.cn;//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. // // 你可 ...
- leetcode算法—两数之和 Two Sum
关注微信公众号:CodingTechWork,一起学习进步. 题目 Two Sum: Given an array of integers, return indices of the two num ...
- 【LeetCode】两数之和、三数之和、四数之和系列
文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...
最新文章
- Go 学习笔记(30)— Go 语言 make 和 new 的区别
- asp遍历前端的所有控件
- creo扫描选择多条链作为轨迹_ProE/Creo圆轨迹可变扫描法创建弧顶面,用上便爱上(一)...
- 如何打印出给定尺寸的方格_打印给定号码的表格| 8086微处理器
- [转载] python数学编程书推荐_图书推荐:《Python数学编程》
- mysql数据库过滤数据_MySQL数据库常规操作一些简单绕过过滤的方法
- 跨时代比较:工业化因素是关键
- 宝塔面板 服务器状态,宝塔面板中重启腾讯云服务器后无法登录宝塔面板怎么办?...
- B站视频解析去水印工具入口
- python爬虫项目(对博思平台社区话题信息进行爬取并保存)
- 代理IP 有效性检测
- 课题:修改ssh的访问端口
- python3d_Power BI将超越python和D3,成为数据可视化的福音、定性数据分析的未来?...
- python正则表达式编译_用Python编译正则表达式
- 【C++】虚函数与虚函数表
- A Personality traits and job candidate screening via analyzing facial videos 阅读笔记
- NDK开发(四):仿QQ变声
- 国家统计局固定资产投资统计
- 野火i.MX6ULL Pro开发板构建根文件系统
- 如何查询计算机记录表,如何查看电脑使用记录
热门文章
- python字符串(in 和not in)(一分钟读懂)
- java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令
- stream流常用方法_Java8 中用法优雅的 Stream,怪不得我之前总是看不懂别人写的代码!...
- mysql库表的触发器表名_MySQL 触发器,实现不同数据库,不同表名,表结构不同,数据实时同步...
- 大工20春《计算机应用基础》在线测试,大工20春《计算机应用基础》在线测试1答案...
- LeetCode Week 4:第 31 ~ 40 题
- 201912-4 区块链(CCF CSP认证)
- ORB-SLMA3的学习笔记
- BasicAuth和OAuth
- 机器学习-多元梯度下降