leetcode--Two Sum
2018-06-18 00:08:00来源:未知 阅读 ()
问题描述:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
1 Given nums = [2, 7, 11, 15], target = 9, 2 Because nums[0] + nums[1] = 2 + 7 = 9, 3 return [0, 1].
通常很容易想到的解法是使用双层循环遍历给定的数组,查找是否有满足条件的两个数。代码如下:
1 vector<int> addToTarget(vector<int> &num,int target) 2 { 3 vector<int> res; 4 for(auto it1 = num.begin(); it1 != num.end();++it1) 5 for(auto it2 = num.begin();it2 != num.end();++it2) 6 { 7 if(*it1 + *it2 == target && it1 != it2) 8 { 9 res.push_back(static_cast<int>(it1 - num.begin())); 10 res.push_back(static_cast<int>(it2 - num.begin())); 11 return res; 12 } 13 } 14 }
但是使用双层循环的时间复杂度为O(n2),且两次循环且条件不满足时,数组的某些元素会被多次遍历,也就是处理当前节点需要依赖于之前的部分结果,如果我们能够保存已遍历的元素的状态,便可减少这种浪费的发生。所以考虑使用哈希表来存储状态,因为哈希表的存储和读取时间复杂度为O(1)。代码如下:
1 vector<int> addToTarget(vector<int> &num,int target) 2 { 3 vector<int> res(2); 4 unordered_map<int,int> hashMap; 5 for(auto it=num.begin();it != num.end(); ++it) 6 { 7 if(hashMap.count(target - *it)) 8 { 9 res[0]=hashMap[target-*it]; 10 res[1]=static_cast<int>(it-num.begin()); 11 return res; 12 } 13 hashMap[*it] = static_cast<int>(it-num.begin()); 14 } 15 }
我们使用hashMap的键来保存给定数组的值,使用hashMap的值来保存给定数组的下标。使用一个循环遍历数组,如果与当先遍历值相加等于targe的值存在于已保存的hashMap中时,记录当前下标和满足值得下标并返回。时间复杂度为O(n)。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:图说 堆排序
- WDK驱动调试问题点滴 2020-04-21
- 螺旋矩阵问题 2020-04-18
- 用C++实现:完美的代价 2020-04-15
- 用C++实现:FJ的字符串打印 2020-04-04
- 递归函数使用动态数组遇到的问题 2020-03-26
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash