<LeetCode> 题57:三数之和

本文介绍了一种寻找数组中三个整数之和为零的所有唯一组合的方法。通过首先排序数组,然后使用双指针技巧来避免重复并高效地解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。
注意:
1)在三元组(a, b, c),要求a <= b <= c。
2)结果不能包含重复的三元组。
例如:给定数组S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:
(-1, 0, 1)
(-1, -1, 2)

思路:

先对数组排序,然后第一个数先固定,后两个数一个在最前,一个在最后,进行遍历。然后第一个数后移,再进行遍历。

代码:

vector<vector<int>> threeSum(vector<int>&nums)
{
    //先对数组进行排序
    sort(nums.begin(), nums.end()); //需要包含#include <algorithm>命名空间
    vector<vector<int>> ret; //数组ret存放返回结果

    for(size_t current = 0; current <nums.size(); current++)
    {
        //由于题目要求不能有重复的,因此,如果当前数与前一个相同,则忽略
        if(current > 0 &&nums[current] == nums[current - 1])
        {
            continue;
        }
        size_t front = current + 1;
        size_t back = nums.size() - 1;
        while(front < back)
        {
            if(front > current + 1 &&nums[front] == nums[front - 1])
            {
                front++;
                continue;
            }
            if(nums[current] + nums[front] + nums[back] < 0)
            {
                front++;
            }
            elseif(nums[current] + nums[front] + nums[back] > 0)
            {
                back--;
            }
            else
            {
                vector<int> temp(3);
                temp.push_back(nums[current]);
                temp.push_back(nums[front]);
                temp.push_back(nums[back]);
                ret.push_back(temp);
                front++;
            }
        }
    }
    return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值