這個題目的思路有以下幾種:
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;
}
};