Leetcode--3Sum
阿新 • • 發佈:2019-02-06
這個題目的思路有以下幾種:
1. 類似2Sum時使用的unordered_map的方法,先選定兩個數,然後利用0-num1-num2的方法去查詢第三個數;缺點:重複的數字會導致重複的數字組合,擬解決方案是使用unique和set的方法讓最後的結果不重複,或者讓nums不重複。
set 使用說明 http://www.cplusplus.com/reference/set/set/
unique使用說明 http://www.cplusplus.com/reference/algorithm/unique/
注:發現unique需要先排序再排重,對於<vector<vector<int>>>無效。
這個方法需要兩次for迴圈不易通過大量資料,且去重方法與下面的一致,就不詳述了。
2.類似Container with most water使用前後兩個索引,遍歷到中間找到合適解。首先通過k確定兩個數總和two_sum,然後使用i,j分別從前、後遍歷資料,如果和大於two_sum,則j--,小於,i++,否則新增符合條件的值。
注:需要把相同的sums[k] sums[i] sums[j]排重,可使用while語句,也可以使用set。
使用set的方法見http://articles.leetcode.com/finding-all-unique-triplets-that-sums
給出我自己使用while的程式碼
class Solution { public: vector> threeSum(vector& nums) { vector> results; sort(nums.begin(),nums.end()); vector result; int k = 0; while(k0){ while(nums[j-1]==nums[j]){j--;} j--; } else{ result.push_back(nums[i]); result.push_back(nums[j]); result.push_back(nums[k]); results.push_back(result); result.clear(); while(nums[i+1]==nums[i]){i++;} while(nums[j-1]==nums[j]){j--;} i++; j--; } } while(nums[k+1]==nums[k]){k++;} k++; } return results; } };