1. Two Sum

1.問題

  • 給予一個整數的array, 回傳兩個數值的索引其相加的總和為指定的目標

  • 你可以假設每個input只有一組答案, 而且不會使用到相同的元素兩次

2.想法

  • 第一種想法是使用recursive + back tracking, 但是這會很花時間, 太多操作

  • 第二種只需要花費O(N)的時間, 將數字儲存到unorder_map中 (map的key是數值, value是索引), 並一邊在map中尋找target - 數值, 如果找到了就則把map的value, value都放到要回傳的vector中

3.程式碼

  • 第一種方法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        vector<int> records;
        vector<bool> used(nums.size(), false);
        tryGetSum(nums, res, records, used, target, 0);
        return res;
    }
private:
    void tryGetSum(vector<int>& nums, vector<int>& res, vector<int>& records, vector<bool>& used, int target, int start) {
        if (records.size() == 2 && 
            (nums[records[0]] + nums[records[1]]) == target){
            res.push_back(records[0]);
            res.push_back(records[1]);
            used[records[0]] = true;
            used[records[1]] = true;
            return;
        } else if (records.size() == 2 && (nums[records[0]] + nums[records[1]]) != target){
            return;
        }
        for (int i = start; i < nums.size(); i++) {
            if (!used[i]) {
                used[i] = true;
                records.push_back(i);
                tryGetSum(nums, res, records, used, target, i + 1);
                records.pop_back();
                used[i] = false;
            }
        }
    }
};
  • 第二種方法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hash;
        vector<int> v;
        for(int i = 0; i < nums.size(); i++) {
            int search = target - nums[i];
            if (hash.find(search) != hash.end()) {
                v.push_back(hash[search]);
                v.push_back(i);
                return v;
            }
            hash[nums[i]] = i;
        }
        return v;
    }
};

4.Performance

  • 第一種方法

  • 第二種方法

Last updated