LeetCode 15-3Sum(双指针)

版权声明:转载请注明出处 https://blog.csdn.net/FGY_u/article/details/84324734

题目: https://leetcode.com/problems/3sum/

概述: 给定一个数组,找出其中的三个数和为0。

思路: 先把整个数组进行排序,然后对数组进行遍历。 要让 -num[i] = num[front] + num[back];即可,如果小了就把front 向右调一调,大了就把back向左调一调。这时候要注意除去重复的值,一个是除去重复的front和back,还有一个是要除去重复的i下标,这都是会影响结果重复的因素。

class Solution {
public:
   vector<vector<int> > threeSum(vector<int> &num) {
    
    vector<vector<int> > res;

    std::sort(num.begin(), num.end());

    for (int i = 0; i < num.size(); i++) {
        
        int target = -num[i];
        int front = i + 1;
        int back = num.size() - 1;

        while (front < back) {

            int sum = num[front] + num[back];
            
            // Finding answer which start from number num[i]
            if (sum < target)
                front++;

            else if (sum > target)
                back--;

            else {
                vector<int> triplet(3, 0);
                triplet[0] = num[i];
                triplet[1] = num[front];
                triplet[2] = num[back];
                res.push_back(triplet);
                
                // Processing duplicates of Number 2
                // Rolling the front pointer to the next different number forwards
                while (front < back && num[front] == triplet[1]) front++;

                // Processing duplicates of Number 3
                // Rolling the back pointer to the next different number backwards
                while (front < back && num[back] == triplet[2]) back--;
            }
            
        }

        // Processing duplicates of Number 1
        while (i + 1 < num.size() && num[i + 1] == num[i]) 
            i++;

    }
    
    return res;
    
}
 

};

猜你喜欢

转载自blog.csdn.net/FGY_u/article/details/84324734