leetcode15 3Sum

来源:互联网 发布:数据集市的作用 编辑:程序博客网 时间:2024/06/06 02:32

题意就是给定一组数,任意选取三个数,每个数只能选取一次,找到所有三个数为0的组合,其实找到所有组合还是比较简单的,先固定一个数,之后两个数因为是在一个序列上选取,定义两个指针一个指向头一个指向尾,根据三个数的和是否大于0来决定往前走还是往后走,这样就简化成n^2的效率.

难点在去重上,先是用了vector的去重结果超时了.

之后就想重复的数一定就是产生重复序列的罪魁祸首,之后就利用三个while循环,略过所有一样的数,调了几次,果断ok了.还是逻辑上想的不够多,导致总是缺项,加强逻辑缜密性啊.


#include "iostream"#include "vector"#include "algorithm"#include "string"using namespace std;class Solution {public:    vector<vector<int> > threeSum(vector<int>& nums) {        int len = nums.size();        int right,left;        sort(nums.begin(),nums.end());                vector<vector<int> > result;                if(len < 3)        return result;        for(int i = 0 ; i < nums.size()-2; i++)         //cout<<"("<<nums[i]<<")\n";        {        if(nums[i]>0)        break;        if(i!=0)        {        if(nums[i] == nums[i-1])        continue;       }        //cout<<"("<<result.size()<<")"<<endl;       //-2 0 1 1 2        right = i+1;        left = nums.size()-1;        for(;right<left;)        {        if(nums[i]+nums[right]+nums[left] == 0)        {        vector<int> temp;        temp.push_back(nums[i]);        temp.push_back(nums[right]);temp.push_back(nums[left]);result.push_back(temp);        }        if(nums[i]>0)        break;        if(nums[i]+nums[right]+nums[left] > 0)        {        left--;        while(nums[left] == nums[left+1])        left--;        }        else        {        right++;        while(nums[right] == nums[right-1])        right++;        }        }        }        //sort(result.begin(), result.end());         //vector<vector<int> >::iterator last2;         //last2 = unique(result.begin(),result.end());      //result.erase(last2, result.end());    return result;    }};int main(){Solution test;vector<int> num;num.push_back(1);num.push_back(1);num.push_back(-2);num.push_back(0);num.push_back(2);//num.push_back(0);vector<vector<int> > result;result = test.threeSum(num);    for(int i = 0 ; i < result.size(); i++)     {    cout<<i<<endl;    for(int j = 0 ; j < result[i].size(); j++)    {    cout<<"<"<<result[i][j]<<">"<<endl;    }    }return 0;}


0 0