[CareerCup] 17.12 Sum to Specific Value 和為特定數
阿新 • • 發佈:2018-12-29
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; } } }