力扣-三数之和

发布时间 2023-09-24 17:24:30作者: 摆烂卧底

1.问题

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

2.说明

输入说明:

首先输入n,表示输入n个整数

输入n个数组nums

输出说明:

输出所有能使得a+b+c=0的三个数的三元组

3.范例

输入范例:

6

-1 0 1 2 -1 -4

输出范例:

-1 0 -1

-1 -1 2

4.思路

使用双指针法进行解题,首先对数组进行排序

使用一层for循环,i遍历数组,当nums[i] >0时,后面的两个数和nums[i]相加一定也是>0,后面可以不再进行计算,因此直接返回reslut

同时定义下标left=i+1,right=nums.size()-1,即三元组nums[i] + nums[left] + nums[right]>0时,说明三数之和大于0,因排过序,因此,right往前移动,right--, 同理,若<0时,left++,直至left=right相遇为止

注意:题目中存在重复的元素,对于nums[i]==nums[i-1] 时,后面所计算的left和right同计算nums[i-1]的结果是一样的,因此需要进行去重!!!而且对a和b和c都需要进行去重!!!

5.代码

#include <iostream>
#include <stdio.h>
#include <algalgorithm>
#include <vector>
class Solution
{
    vector<vector<int>> treeSum(vector<int> &nums)
    {
        vector<vector<int>> result;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]>0)
                return result;
            //对a进行去重
            if(i>0&&nums[i]==nums[i-1])
                continue;

            int left=i+1;
            int right=nums.size()-1;
            while(left<right)
            {
                if(nums[i]+nums[left]+nums[right]>0)
                    right--;
                else if(nums[i]+nums[left]+nums[right]<0)
                    left++;
                else
                {
                    result.push_back(vector<int>{nums[i],nums[left],nums[right]});
                    //去重逻辑应该放在找到一个三元组之后,对b 和 c去重
                    while(right>left&&nums[right]==nums[right-1]) right--;
                    while(right>left&&nums[left]==nums[left+1]) left++;
                    //找到答案时,双指针同时收缩
                    right--;
                    left++;
                }
            }
        }
        return result;
    }
};
int main()
{
    //三数之和
    int n;
    cin>>n;
    vector<int> nums;
    int data;
    for(int i=0;i<n;i++)
    {
        cin>>data;
        nums.push_back(data);
    }
    vector<vector<int>> res=Solution().treeSum(nums);
    for(int i=0;i<res.size();i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<res[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}