Leetcode--3Sum

這個題目的思路有以下幾種:

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;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章