#57 3Sum

本文探讨了如何解决三数之和为零的问题,通过遍历数组并使用双指针法寻找所有唯一三元组,使得这三个数相加等于零。代码采用C++实现,并确保结果中不含重复的三元组。

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

题目描述:

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

 Notice

Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)

The solution set must not contain duplicate triplets.

Example

For example, given array S = {-1 0 1 2 -1 -4}, A solution set is:

(-1, 0, 1)
(-1, -1, 2)
题目思路:

这题有3个未知数,如果我们能定下一个未知数,剩下的两个就可以用two pointers的方法来解决了。那这样想就好办了,我们可以把一个未知数从i = 2...A.size() - 1遍历,然后剩下的两个用two pointers来找到答案。

Mycode(AC = 13ms):

class Solution {
public:    
    /**
     * @param numbers : Give an array numbers of n integer
     * @return : Find all unique triplets in the array which gives the sum of zero.
     */
    vector<vector<int> > threeSum(vector<int> &nums) {
        // write your code here
        vector<vector<int>> ans;
        if (nums.size() <= 2) return ans;
        
        sort(nums.begin(), nums.end());
        
        set<vector<int>> visited;
        
        // traverse the 3rd number in array, 
        // use two pointers method to find 1st and
        // 2nd numbers
        for (int i = 2; i < nums.size(); i++) {
            int l = 0, r = i - 1;
            while (l < r) {
                if (nums[l] + nums[r] == -nums[i]) {
                    if (visited.find({nums[l], nums[r], nums[i]}) == visited.end()) {
                        visited.insert({nums[l], nums[r], nums[i]});
                        ans.push_back({nums[l], nums[r], nums[i]});
                    }
                    l++;
                    r--;
                }
                else if (nums[l] + nums[r] < -nums[i]) {
                    l++;
                }
                else {
                    r--;
                }
            }
        }
        
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值