三数之和c++

三数之和c++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<vector<int>> threeSum(vector<int>& nums) {
    vector<vector<int>> res;

    // 对数组进行排序
    sort(nums.begin(), nums.end());

    // 遍历排序后的数组
    for (int i = 0; i < nums.size(); i++) {
        // 如果当前元素大于 0,则三数之和必定大于 0,结束循环
        if (nums[i] > 0) {
            break;
        }
        // 如果当前元素与前一个元素相等,则跳过当前循环,避免重复计算
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        // 定义两个指针,分别指向当前元素的下一个位置和数组末尾
        int l = i + 1;
        int r = nums.size() - 1;
        // 循环计算当前元素与其后面的元素组合的两数之和
        while (l < r) {
            int sum = nums[i] + nums[l] + nums[r];
            // 如果三数之和等于 0,则将结果添加到结果数组中
            if (sum == 0) {
                res.push_back({nums[i], nums[l], nums[r]});
                // 避免重复计算,同时将指针移动到下一个不同的元素位置
                while (l < r && nums[l] == nums[l + 1]) {
                    l++;
                }
                while (l < r && nums[r] == nums[r - 1]) {
                    r--;
                }
                l++;
                r--;
            }
            // 如果三数之和小于 0,则将左指针右移一位
            else if (sum < 0) {
                l++;
            }
            // 如果三数之和大于 0,则将右指针左移一位
            else {
                r--;
            }
        }
    }

    return res;
}

int main() {
    vector<int> nums = {-1, 0, 1, 2, -1, -4};
    vector<vector<int>> res = threeSum(nums);

    for (vector<int> vec : res) {
        for (int i : vec) {
            cout << i << " ";
        }
        cout << endl;
    }

    return 0;
}