1. 程式人生 > 實用技巧 >1.兩數之和

1.兩數之和

1.兩數之和 原題連結

題解

在陣列中找到一組陣列使得他們的和為目標值,最容易想到的方式是暴力的做法,直接利用兩個迴圈

程式碼如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n=nums.size();
        int i,j;
        for(i=0;i<n-1;++i){
            for(j=i+1;j<n;++j)
            if(nums[i]+nums[j]==target){
                return {i,j};
            }
        } 
        return{i,j};
    }  
};

上述的方法的時間複雜度為O(n^2),時間複雜度較高,因此我們可以優化內層迴圈,使用雜湊表的方式

程式碼如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        if(nums.size() == 0) return {};
        unordered_map<int, int> m;

        for(int i = 0; i < nums.size(); ++i){
            int t = target - nums[i];
            if(m.count(t)) return {i, m[t]};
            m[nums[i]] = i;
        }

        return {};
    }
};

上述的雜湊表的方式,只要不存在大量的雜湊衝突(一般也不會存在,除非題目故意卡你),查詢和插入的時間複雜度近似為常數級,所以時間複雜度為O(N)