Leetcode Two Sum

OpenSoucre發表於2014-03-24
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=9
Output: index1=1, index2=2
//先對numbers陣列排序,然後利用左右兩個指標查詢,注意原有陣列的索引,時間複雜度O(nlogn)
#include <iostream> #include <vector> #include <algorithm> #include <map> #include <iterator> using namespace std; vector<int> twoSum(vector<int> &numbers, int target){ vector<int> numberCopy=numbers; sort(numberCopy.begin(),numberCopy.end()); int left = 0, right = numberCopy.size()-1; vector<int> res; while(left < right){ if(numberCopy[left]+numberCopy[right] > target) right--; else if(numberCopy[left]+numberCopy[right] < target) left++; else { vector<int>::iterator firstIndex = find(numbers.begin(),numbers.end(),numberCopy[left]); int first = distance(numbers.begin(),firstIndex); vector<int>::iterator secondIndex = find(numbers.begin(), numbers.end(),numberCopy[right]); if(secondIndex == firstIndex) secondIndex = find(secondIndex+1, numbers.end(),numberCopy[right]); int second = distance(numbers.begin(),secondIndex); if(first > second) swap(first,second); res.push_back(first+1); res.push_back(second+1); break; } } return res; } int main(){ vector<int> numbers; numbers.push_back(0); numbers.push_back(4); numbers.push_back(3); numbers.push_back(0); vector<int> res = twoSum(numbers,0); cout<<res[0]<<" "<<res[1]<<endl; }
/*
 *利用map儲存,由於map的find函式的時間複雜度是O(logn),故總體的時間複雜度是O(nlogn),
 *可以將map換成hashMap,hashMap的查詢時間複雜度為O(1),故整體時間複雜度為O(n)
 *由於C++98不支援hashMap可以換成java的hashMap
 *也可以利用C++11的unordered_map,其是c++的hashMap
 */
 
#include <iostream>
#include <vector>
#include <map>

using namespace std;

vector<int> twoSum(vector<int> &numbers, int target){
    map<int,int> twoSumMap;
    vector<int> res(2);
    for(int i = 0 ; i <  numbers.size(); ++ i){
        if(twoSumMap.find(numbers[i])!= twoSumMap.end()){
            res[0] = twoSumMap[numbers[i]]+1;
            res[1] = i + 1;
            break;
        }else{
            twoSumMap.insert(make_pair(target-numbers[i],i));
        }
    }
    return res;
}

利用C++11unordered_map,時間複雜度O(n)

#include <iostream>
#include <vector>
#include <unordered_map>

using namespace std;

vector<int> twoSum(vector<int> &numbers, int target){
    unordered_map<int,int> twoSumMap;
    vector<int> res(2);
    for(int i = 0 ; i <  numbers.size(); ++ i){
        if(twoSumMap.find(numbers[i])!= twoSumMap.end()){
            res[0] = twoSumMap[numbers[i]]+1;
            res[1] = i + 1;
            break;
        }else{
            twoSumMap.insert(make_pair(target-numbers[i],i));
        }
    }
    return res;
}

 

相關文章