給定一個整型數組,從中挑選兩個數字,使其相加爲一個爲一個給定的值,返回這兩個值全部數組中位置下標,位置下標小的在前面,位置下標從1開始。html
//解法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; }