57. 三數之和 &&

weixin_34162629發表於2018-09-05

題目

57. 三數之和

給出一個有n個整數的陣列S,在S中找到三個整數a, b, c,找到所有使得a + b + c = 0的三元組。
樣例

如S = {-1 0 1 2 -1 -4}, 你需要返回的三元組集合的是:

(-1, 0, 1)

(-1, -1, 2)
注意事項

在三元組(a, b, c),要求a <= b <= c。

結果不能包含重複的三元組。

解析

  • 主要注意去除重複元素的方法
class Solution_57 {
public:
    /**
    * @param numbers: Give an array numbers of n integer
    * @return: Find all unique triplets in the array which gives the sum of zero.
    */

    vector<vector<int>> threeSum(vector<int> &numbers) {
        // write your code here
        vector<vector<int>> ret;
        if (numbers.size() < 3)
            return ret;
        sort(numbers.begin(), numbers.end());
        vector<int> vec;
        for (int i = 0; i < numbers.size() - 2; i++)
        {
            if (i >= 1 && numbers[i - 1] == numbers[i]) //去重複元素
            {
                continue;
            }

            int b = i + 1;
            int c = numbers.size() - 1;

            while (b<c)
            {
                while (b<c&&c<numbers.size() - 1 && numbers[c + 1] == numbers[c]) //去重只需要在查詢到過後進行,所以放在下面else裡面,容易理解一些
                    c--;
                while (b<c&&b - 1>i&&numbers[b - 1] == numbers[b])
                    b++;
                if (b == c)
                    continue;

                int sum = numbers[i] + numbers[b] + numbers[c];
                if (sum>0)
                {
                    c--;
                }
                else if (sum < 0)
                {
                    b++;
                }
                else
                {
                    vec.clear();
                    vec.push_back(numbers[i]);
                    vec.push_back(numbers[b]);
                    vec.push_back(numbers[c]);
                    ret.push_back(vec);
                    //break; //bug
                    c--;
                    b++;
                }
            }
        }
        return ret;
    }


    vector<vector<int>> threeSum(vector<int> &numbers) {
        // write your code here
        vector<vector<int>> ret;
        if (numbers.size() < 3)
            return ret;
        sort(numbers.begin(), numbers.end());
        vector<int> vec;
        for (int i = 0; i < numbers.size() - 2; i++)
        {
            if (i >= 1 && numbers[i - 1] == numbers[i]) //去重複元素
            {
                continue;
            }

            int b = i + 1;
            int c = numbers.size() - 1;

            while (b<c)
            {

                int sum = numbers[i] + numbers[b] + numbers[c];
                if (sum>0)
                {
                    c--;
                }
                else if (sum < 0)
                {
                    b++;
                }
                else
                {
                    vec.clear();
                    vec.push_back(numbers[i]);
                    vec.push_back(numbers[b]);
                    vec.push_back(numbers[c]);
                    ret.push_back(vec);
                    //break; //bug
                    c--;
                    b++;

                    while (b < c&&numbers[c + 1] == numbers[c])
                        c--;
                    while (b < c&&numbers[b - 1] == numbers[b])
                        b++;

                }
            }
        }
        return ret;
    }
};

相關文章