美文网首页
LeetCode15-3Sum(C++)

LeetCode15-3Sum(C++)

作者: PengQ1 | 来源:发表于2020-04-04 19:14 被阅读0次

Description

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
    [-1, 0, 1],
    [-1, -1, 2]
]

AC代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        
        vector<vector<int>> result;
        if(nums.empty()) {
            return result;
        }

        size_t n_size = nums.size();
        sort(nums.begin(), nums.end());
        for(int i=0; i<n_size; ++i) {
            //如果当前值大于0的话,就没有继续下去的意义了
            if(nums[i] > 0) {
                break;
            }

            if(i > 0 && nums[i] == nums[i-1]) {
                continue;
            }

            int left = i + 1;
            int right = n_size -1;

            while(left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                if(sum > 0) {
                    right--;
                } else if (sum < 0) {
                    left++;
                } else { //sum=0,存储结果
                    result.push_back({nums[i], nums[left], nums[right]});
                    int last_left = left;
                    int last_right = right;
                    while(left < right && nums[left] == nums[last_left]) {
                        left++;
                    }
                    while(left < right && nums[right] == nums[last_right]) {
                        right--;
                    }
                }
            }
        }
        return result;
    }
};

测试代码

int main() {
    Solution s;
    vector<int> a1{-1, 0, 1, 2, -1, -4};
    vector<vector<int>> result1 = s.threeSum(a1);
    for(vector<int> combo:result1) {
        for(int i=0; i<combo.size(); i++) {
            cout << combo[i] << " ";
        }
        cout << endl;
    }

    vector<int> a2{0, 0, 0};
    vector<vector<int>> result2 = s.threeSum(a2);
    for(vector<int> combo:result2) {
        for(int i=0; i<combo.size(); i++) {
            cout << combo[i] << " ";
        }
        cout << endl;
    }
}

总结

这一题其实比较难了,核心思路就是先对给定的数组进行排序,然后设定一个指针进行遍历,把负数部分遍历一遍,然后设定前后各一个指针,计算三者的和,根据和的正负性决定指针的移动方向。题目中比较容易忽视的情况就是如果数组里有数值相等,这里需要多加一些判定条件,如果遇到了连续的相等数值,需要跳过。

相关文章

网友评论

      本文标题:LeetCode15-3Sum(C++)

      本文链接:https://www.haomeiwen.com/subject/wfqsphtx.html