LeetCode刷题笔记----P15 three sum

LeetCode刷题笔记----P15 three sum

0.问题描述

Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Notice that the solution set must not contain duplicate triplets.

1.其他方法

    首先思考暴力法是否能解决,发现并不理想,时间复杂度高(O(n3))的情况下,去重也不方便。
    然后想到之前做的two sum中的哈希法,发现并不适合此处的three sum,去重太多情况,太复杂。

2.双指针

1.0

具体思路:先对nums进行排序,固定一个指针i,其余两个指针j、k分别指向i+1和末尾,若三数之和大于0,则k–;若三数之和小于0,则j++

vector<vector<int>> threeSum(vector<int>& nums) {   
     vector<vector<int>> result;
     int j,k;
     sort(nums.begin(),nums.end());
    for(int i=0;i<nums.size();i++){
         j=i+1;
         k=nums.size()-1;
         while(j<k){
          if(nums[i]+nums[j]+nums[k]>0)
           k--;
          else if(nums[i]+nums[j]+nums[k]<0)
           j++;
           else{
               vector<int> answer;
               answer.push_back(nums[i]);
               answer.push_back(nums[j]);
               answer.push_back(nums[k]);
               result.push_back(answer);
               j++;k--;
           }
         }   
    }  
       return result;
    }

还是没能解决去重问题,留到2.0吧,下班啦,吃饭去啦~

在这里插入图片描述

2.0

具体去重方案如下:
1.不对同一个a考虑,如:-4 -1 -1 0 1 2,在确定a时,不考虑两次-1
2.在寻找到一个三元组后,把相同的b、c跳过,如:-2, -1, -1,3, 3
[-2,-1,3]符合规则,第二个应该[-2,-1,3]跳过

    vector<vector<int>> threeSum(vector<int>& nums) {   
     vector<vector<int>> result;
     int j,k;
     sort(nums.begin(),nums.end());
    for(int i=0;i<nums.size();i++){
        //第一次去重:不对同一个a进行考虑
        if(i!=0&&nums[i]==nums[i-1]) continue;
         j=i+1;
         k=nums.size()-1;
         while(j<k){
          if(nums[i]+nums[j]+nums[k]>0)
           k--;
          else if(nums[i]+nums[j]+nums[k]<0)
           j++;
           else{
                        
               vector<int> answer;
               answer.push_back(nums[i]);
               answer.push_back(nums[j]);
               answer.push_back(nums[k]);
               result.push_back(answer);
               j++;k--;
              
                 //第二次去重:去除b、c中相等的数
               while(j<k&&nums[j-1]==nums[j]) j++;
               while(j<k&&nums[k+1]==nums[k]) k--;
               
           }
         }   
    }  
       return result;
    }

结束~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值