Contact me:

算法32 leetcode15 sumthree

主要就是利用左右指针把O(n3)降到O(n2)
剩下的就想办法排除重复

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ts;//返回
        int m = nums.size();//长度
        if(m < 3) return{};//排除不足3

        sort(nums.begin(),nums.end());//排序
        
        for(int i = 0;i < m&&nums[i] <= 0;i++){//n
            if(i > 0&& nums[i] == nums[i-1])//排除重复
                continue;

            int n=i+1;//左指针
            int tm=m-1;//右指针
            
            //n^2
            while(n<tm){//左右指针 判断+排除重复
                if(nums[i]+nums[n]+nums[tm]>0||tm<m-1&&nums[tm]==nums[tm+1]){//
                    tm--;
                    continue;
                } 
                else if(nums[i]+nums[n]+nums[tm]<0||n>i+1&&nums[n]==nums[n-1]){
                    n++;
                    continue;
                } 

                if(nums[i]+nums[n]+nums[tm]==0){
                    ts.push_back({nums[i],nums[n],nums[tm]});
                    n++;
                    tm--;
                }
                
            }
        }
        return ts;
    }
};
posted @ 2021-12-18 15:26  impwa  阅读(21)  评论(0编辑  收藏  举报