leetcode15_三数之和

一、题目

 

 二、分析

   主要难点在于去重,而且补充元素去重,而是排列去重,这个用哈希来实现其实我感觉比较困难,后来看他们推荐的算法,还是采用的双指针逼近来完成这道题目。

算法流程如下

 

 算法复杂度分析如下

 

 三、代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> final_result;
        //升序排列
        sort(nums.begin(), nums.end());
        int length = nums.size();
        if(length<3) return final_result;
        //遍历
        for(int i=0; i<length; i++){
            //大于0,结束本次循环
            if(nums[i]>0) break;
            //跳过重复元素
            if(i>0){
                 if(nums[i] == nums[i-1])
                    continue;
            }
            int left = i+1;
            int right = length-1;
            //执行循环s
            //std::cout<<"i : "<<i<<std::endl;
            while(left<right){
                //如果满足条件
                if(nums[i]+nums[left]+nums[right]==0){
                    vector<int> pre = {nums[i], nums[left], nums[right]};
                    //std::cout<<"result : "<<nums[i]<< nums[left]<< nums[right]<<std::endl;
                    final_result.push_back(pre);
                    //去重
                    while(left<right && nums[left]==nums[left+1]){
                        left++;
                        //std::cout<<"left: "<<left<<std::endl;
                    } 
                    while(left<right && nums[right]==nums[right-1]){
                        right--;
                        //std::cout<<"right: "<<right<<std::endl;
                    } 
                    left++;
                    right--;
                }
                else if(nums[i]+nums[left]+nums[right]<0) left++;
                else right--;
                //std::cout<<"index : "<<i<<" "<<left<<" "<<right<<std::endl;
            }  
        }
        return final_result;
    }
};

四、比较

在去重nums[i]的时候,我是这样写的,

if(i>0){
                 while(nums[i] == nums[i-1])
                    i++;
            }

而不是上面那样写的,这样看起来也是可以的,但是会保存。

后来我发现是在面对例子[0,0,0,0]这种情况的时候,它会一直遍历到index 4,这样访问的地址就出错了。所以还是上面的方法好一点,直接跳过本次循环

 

posted @ 2021-11-24 11:03  星光夜  阅读(45)  评论(0)    收藏  举报