1. 程式人生 > >3Sum 三數之和

3Sum 三數之和

             class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int>> res;
        sort(num.begin(), num.end()); //首先排序
        for (int k = 0; k < num.size(); ++k)
        {
            if (num[k] > 0) break; //因為是排好序了,如果num[k]>0,之後一定找不到三個數相加為0;
            if (k > 0 && num[k] == num[k - 1]) continue; //跳過相等的兩個數;不需要重複尋找;
            int target = 0 - num[k]; //轉換為兩數求和得到target;
            int i = k + 1, j = num.size() - 1; //從k位置一直尋找到結束;
            while (i < j)
            {
                if (num[i] + num[j] == target)
                {
                    res.push_back({num[k], num[i], num[j]});
                    while (i < j && num[i] == num[i + 1]) ++i;//跳過相同的數
                    while (i < j && num[j] == num[j - 1]) --j;//...
                    ++i; --j; //從兩邊向中間收縮;
                } 
                else if (num[i] + num[j] < target) ++i; //相加的數小了,向右靠;
                else --j; //相加的數大了,向左靠;
            }
        }
        return res;
    }
};