two Sum leetCode第一题
来源:互联网 发布:调度软件 编辑:程序博客网 时间:2024/05/16 15:25
题目描述:
Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.You may assume that each input would have exactly one solution.Input: numbers={2, 7, 11, 15}, target=9Output: index1=1, index2=2题目tags为:Array Hash Table
思路:
最原始的方法就是使用组合的思想,使用一个嵌套循环,让一个元素与其之后的每个元素都加一次,判断是否与target相等
vector<int> Solution::twoSum(vector<int> &nums, int target){int vSize = nums.size();int index = 0;int num, tmp;vector<int> vResult;int i, j;for (i=0; i<vSize; ++i){for (j=i+1; j<vSize; ++j){if (nums[i] + nums[j] == target){vResult.push_back(i + 1);vResult.push_back(j + 1);//cout << "index1=" << i << ", index2=" << j <<endl;}}}return vResult;}该方法的时间复杂度是O(n^2),提交上去是会超时的
使用map,在nums这个vector中查找的同时,将其插入到map中,向map中插入时是将nums[i]作为key,将下标i作为value,代码为:
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int vSize = nums.size(); int index = 0; int num, tmp; vector<int> vResult; map<int,int> tmpMap; for (index = 0; index < vSize; ++index) { tmp = nums[index]; num = tmpMap.count(target - tmp); if (0 != num) { map<int,int>::iterator mapIter = tmpMap.find(target - tmp); vResult.push_back(mapIter->second + 1); vResult.push_back(index+1); } num = tmpMap.count(tmp); if (0 == num) { tmpMap.insert(pair<int,int>(nums[index],index)); } } return vResult; }};首先判断target - nums[index]是否在tmpMap中,如果该值为tmpMap中,则index和target - nums[index]所对应的下标就是所需要的结果;否则,则将nums[index]存入到tmpMap中。关于这样写的原因如下:
- 为啥要使用map:因为在map中查找某个值的复杂度比较小,为logN
- 为啥要先判断target - nums[index]是否在tmpMap中:在提交时遇到这么一组数据:3,2,4;target为6。如果要按照先判断nums[index]是否在tmpMap中,不在tmpMap中则将nums[index]和index插入到map中,然后再判断target - nums[index]是否在tmpMap中。这样的话,tepMap为空,3不在map中,然后插入3,再判断6-3=3是否在map中,由于刚刚插入了一个3,所以现在6-3=3就在map中了,这样就会导致一个错误的结果
- 为啥mapIter->second就比index要大:由于target为nums中的两个下标不同的元素的和(这两个下标在本文中先记为i1和i2),并且循环是从0~vSize,当遍历到nums[i1]时,此时target - nums[i1] (其值与nums[i2]相同)还未被插入到map中,因此会执行insert操作,将nums[i1]插入到map中,当再遍历到nums[i2]时,此时target - nums[i2] (其值与nums[i1]相同,并且nums[i1]已存在于map中)会被找到,所以也就操作完成了
0 0
- leetcode 第一题 two sum
- LeetCode 第一题,Two Sum
- leetcode第一题two sum
- Two Sum leetcode第一题
- two Sum leetCode第一题
- leetcode 第一题:two sum
- LeetCode第一题Two Sum
- Leetcode第一题--------- Two Sum
- Leetcode第一题<two sum>
- LeetCode第一题:Two Sum
- leetcode------第一题 Two Sum
- LeetCode 1.Two Sum ------------LeetCode 第一题
- Leetcode 第一题 Two Sum java代码
- Leetcode 之第一题 two sum
- Leetcode oj1 第一题 two sum
- 第一题: Two Sum
- 第一题 two-sum
- leetcode第一题(medium)——Two Sum
- 企业必用之单点VPN
- 用户数据报协议 UDP
- Windows 2003 AD升级至Windows 2012 AD之DHCP服务器迁移
- Windows 2003 AD升级至Windows 2012 AD之CA服务器迁移
- 将博客搬至CSDN
- two Sum leetCode第一题
- 部署分布式文件系统(DFS)
- 部署高可用的分布式文件系统(DFS)
- 第九题
- 利用共享文件夹实现故障转移群集的仲裁盘
- tomcat之Java Servlet Specification分析
- ZOJ 1108 FatMouse's Speed
- 关于LINUX打PACTH简单记载
- HDU3416 Marriage Match IV(spfa+最大流SAP)