标签:
给定一个整型数组,从中挑选两个数字,使其相加为一个为一个给定的值,返回这两个值所有数组中位置下标,位置下标小的在前面,位置下标从1开始。
//解法1:最简单的方法,用两层循环,算法如下,算法复杂度为O(n*n) //这个也是最容易想到的。 vector<int> twoSum1(vector< int>& nums, int target) { int i=0; int count = nums.size(); while(i<count){ int j=i+1; while(j<count){ if(nums[i]+nums[j]==target){ vector< int> r; r.push_back(i+1); //下标+1 因为下标从1开始的 r.push_back(j+1); return r; } j++; } i++; } } //解法2:利用hash表,c++中可以使用map。时间复杂度O(n) vector<int> twoSum2(vector< int>& nums, int target){ vector< int> result; unordered_map< int,int > maping; //1.用数组中nums中的值key,用下标作为value; for (int i=0;i<nums.size();i++){ maping[nums[i]]=i; } for (int i=0;i<nums.size();i++){ //2.求的另一个加数 int otherNum = target-nums[i]; //3.从maping中寻找key为另一个加数的value if(maping.find(otherNum)!=maping.end() && maping[otherNum]!=i){ result.push_back(i+1); result.push_back(maping[otherNum]+1); break; } } return result; }
标签:
原文地址:http://www.cnblogs.com/qiange/p/5090588.html