LeetCode 15. 3Sum

来源:互联网 发布:网络五大鬼畜歌曲 编辑:程序博客网 时间:2024/06/09 21:04
  1. 题目描述
    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.
  2. 解题思路
    首先这道题目可以暴力的做,三重循环,复杂度是O(n3)。如果改进一下先排序再用头尾指针做,复杂度是O(n2+nlogn)=O(n2)
    首先排序复杂度是O(nlogn),然后对数组的前n3个元素开始扫。假设当前取出的是第i个元素,那么头指针就指向i+1,尾指针指向n-1,开始扫。
    如果nums[i]+nums[head]+nums[tail] ==0
    结果放入答案集,且++head
    如果nums[i]+nums[head]+nums[tail] >0
    则–tail
    如果nums[i]+nums[head]+nums[tail] >0
    则++head

  3. 代码实现

#include<algorithm>class Solution {public:    vector<vector<int> > threeSum(vector<int>& nums) {        vector<vector<int> > v;        if(nums.size()<3){            return v;        }        sort(nums.begin(),nums.end());        for(int i=0;i<nums.size()-2;++i){            if(i!=0&&nums[i]==nums[i-1]){                continue;            }            int rest=-nums[i];            int head=i+1;            int tail=nums.size()-1;            while(tail>head){                if(nums[head]==nums[head-1]&&head!=i+1){                    ++head;                    continue;                }                if(tail!=nums.size()-1&&nums[tail]==nums[tail+1]){                    --tail;                    continue;                }                if(nums[tail]+nums[head]==rest){                    vector<int> t;                    t.push_back(nums[i]);                    t.push_back(nums[head]);                    t.push_back(nums[tail]);                    v.push_back(t);                    ++head;                }                else if(nums[tail]+nums[head]>rest){                    --tail;                }                else{                    ++head;                }            }        }        return v;    }};
0 0
原创粉丝点击