1. 程式人生 > >[CareerCup] 17.12 Sum to Specific Value 和為特定數

[CareerCup] 17.12 Sum to Specific Value 和為特定數

17.12 Design an algorithm to find all pairs of integers within an array which sum to a specified value.

這道題實際上跟LeetCode上的Two Sum很類似,但是不同的是,那道題限定了只有一組解,而這道題說可以有很多組符合要求的解,那麼我們先來看一種使用雜湊表的解法,這種解法的時間複雜度是O(n),空間複雜度是O(1),思路是用雜湊表建立每個數字和其下標之間的對映,遍歷整個數字,如果target減去當前數字的值在雜湊表中存在,那麼返回這一對結果,然後更新當前數字在雜湊表中的對映值,參見程式碼如下:

解法一:

void find_pairs(vector<int>& nums, int target) {
    unordered_map<int, int> m;
    for (int i = 0; i < nums.size(); ++i) {
        if (m.count(target - nums[i])) {
            cout << nums[i] << " " << nums[m[target - nums[i]]] << endl;
        }
        m[nums[i]] 
= i; } }

下面這種方法是利用了雙指標的思路,我們首先要把陣列排個序,然後左右兩個指標向中間移動,如果當前兩個指標指的數加起來正好等於target,則找到了一對結果,如果大於target,那麼我們將右指標左移一位,這樣值能減小一些,如果和小於target,則把左指標右移一位,這樣和能增大一些,參見程式碼如下:

解法二:

void find_pairs(vector<int> nums, int target) {
    sort(nums.begin(), nums.end());
    int left = 0, right = nums.size() - 1
; while (left < right) { int sum = nums[left] + nums[right]; if (sum == target) { cout << nums[left] << " " << nums[right] << endl; ++left; --right; } else if (sum > target) { --right; } else { ++left; } } }