LeetCode算法题——15. 3Sum

来源:互联网 发布:理科生 禅师 知乎 编辑:程序博客网 时间:2024/06/06 21:04
题目:
Given an array S of n integers, are there elements abc 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]
]    

算法思想:
可以采用三层for直接搜索结果,此时算法复杂度为O(n^3),出现超时的错误,此时先对原始数据进行排序,先固定一个数,然后将3Sum可转换为2Sum问题,即寻找数组中满足两个数之和为target=0-第一个数的值,在2Sum问题中,定义首尾两个指针,判断该指针对应两个数的和,若大于target,则尾指针向前移动,小于target则首指针向后移动,知道尾指针小于或者等于首指针时,循环结束。且在其中需要去除重复出现的组合,此时当遇到与前一个相同的数字时,跳过改数字。

C++算法实现如下:

#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution {public:    vector<vector<int> > threeSum(vector<int>& nums) {        vector<vector<int> > result;        bool flag;        sort(nums.begin(),nums.end());        for(int i=0;i<nums.size();i++){            if(i>0&&nums[i]==nums[i-1])                continue;            int target=0-nums[i];            int j=i+1;            int k=nums.size()-1;            while(j<k){                if(nums[j]+nums[k]==target){                    vector<int> temp;                    temp.push_back(nums[i]);                    temp.push_back(nums[j]);                    temp.push_back(nums[k]);                    result.push_back(temp);                    while (j < k && nums[j] == nums[j + 1]) ++j;//重复元素跳过                    while (i < k && nums[k] == nums[k - 1]) --k;                    k--;                    j++;                }else if(nums[j]+nums[k]>target){//两数之和大于目标值,则尾指针向前移动                    k--;                }else{                    j++;                }               }                 }        return result;    }};int main(){    vector<vector<int> > result;    int d[6]={-1, 0, 1, 0, 0, -4};    vector<int> data;    for(int i=0;i<6;i++){        data.push_back(d[i]);    }    Solution sol;    result=sol.threeSum(data);    for(int i=0;i<result.size();i++){        for(int j=0;j<result[i].size();j++){            cout<<result[i][j]<<" ";        }        cout<<endl;    }}


0 0
原创粉丝点击