1. Two Sum

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:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

方法一是使用暴力求解,時間複雜度爲n^2,當數據很大時,效率很低
方法二是先排序再判斷,時間複雜度是nlgn。開始用快排,或其他排序方法對nums排序,然後用兩個指針從前後開始進行判斷,然後從i=0,j=end開始和末位的兩個數字開始,計算兩個之和sum,若sum大於目標值target,則需要一個較小的因子,j–;反之,i++;直至找到最終的結果。
這裏沒有返回標號
方法三是用哈希,時間複雜度是o(n). 哈希表在理想的情況下查找一個數是O(1),新的c++11中增加了unordered_map;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int>res(2,-1);
        unordered_map<int,int>m;
        for(int i=0;i<nums.size();i++){
            int t=target-nums[i];
            if(m.find(t)==m.end()){
                m[nums[i]]=i;
            }else{
                res[0]=m[t];
                res[1]=i;
                break;
            }
        }
        return res;
    }
};

如果使用stl中的map,則時間複雜度是nlgn, stl中的map容器的底層實現是紅黑樹,查找find需要的時間是lgn,外層遍歷是n。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章