LeetCode 15. 3Sum

题目

Given an array S of n integers, are there elements a, b, c in S 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.

For example, given array S = [-1, 0, 1, 2, -1, -4],

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

题意

给出一个数组,找出数组中任意三个和为0的数,得到的集合里面不能包括重复的三元组。比如,给出数组S = [-1, 0, 1, 2, -1, -4],

解法是:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

分析

这道题可以用深度搜索,考虑到深度只为3,我做了简化,首先选定第一个数one,那么剩下的两个数two、three符合条件,-one = two+three。考虑到two和three是数组中不同下标的值,可以分别从给出数组头和尾部往中间找。

时间复杂度为O(n*n)

注意:解集不能存在重复的三元组。


代码

void findSum(vector<int>& nums,vector<vector<int>> &result,int target, int index){
    int two=index+1, three =nums.size()-1;
    while(two<three){
        if(nums[index]+nums[two]+nums[three]==target){
            vector<int> temp = {nums[index],nums[two],nums[three]};
            result.push_back(temp);
            while (two < three && nums[two] == temp[1]) two++;
            while (two < three && nums[three] == temp[2]) three--;
        }
        else if(nums[index]+nums[two]+nums[three]>target)
            three--;
        else if(nums[index]+nums[two]+nums[three]<target)
            two++;
    }
    while (index + 1 < nums.size() && nums[index + 1] == nums[index])
        index++;
    if(index<nums.size()-2)
        findSum(nums, result, target,index+1);
}
vector<vector<int>> threeSum(vector<int>& nums) {
    vector<vector<int>> result;
    if(nums.size()<3)
        return result;
    std::sort(nums.begin(), nums.end());
    findSum(nums,result,0,0);
    return result;
}

313 / 313 test cases passed.
Status: Accepted

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值