LeetCode 15. 3Sum

来源:互联网 发布:win10重装linux子系统 编辑:程序博客网 时间:2024/06/15 23:57

  • 题目
  • 题意
  • 分析
  • 代码

题目

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
原创粉丝点击