三数之和(leetcode15排序,双指针)-------------------c++实现

三数之和(leetcode15排序,双指针)-------------------c++实现

题目表述

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

样例

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
输入:nums = []
输出:[]

条件

0 <= nums.length <= 3000
-105 <= nums[i] <= 105

思路

排序后
确定第一个数后
两个指针扫描,一个从前往后,一个从后往前

注意点

答案中不可以包含重复的三元组,但是三个元素的值可以相同(做的时候以为不能相同,所以耽误了1个多小时)。
而且当时思路错了
-1,-1,-1,0三个元素-1排序后并列,扫完第一个-1以后就可以扫坐标为0的序列了,当时的想法是:
-1,-1,2可以是,然后-1作为单个元素的时候也可以是其中的组合
但是其实第一个-1的时候已经把单个-1的组合可能扫完了。

ac代码

c++:
class Solution {
public:
    vector<vector<int> > threeSum(vector<int>& nums) {
              vector<vector<int> > result;
              int j,k;//第二位第三位的位置
              sort(nums.begin(),nums.end());//排序
              int  i=0,jbefore,kbefore,target;
           jbefore=100005,kbefore=100005;
             int n = nums.size();
              while(i<=(n-3)){
                  j=i+1,k=nums.size()-1;
                  if(i>0&&nums[i-1]==nums[i])
                  {
                      i++;
                      continue;
                  }   //判断第一个数是否重复
                  if(nums[i]>0)
                  break;
                   target=0-nums[i];
                  while(j<k){
                      if(nums[k]+nums[j]==target)//如果有一样的就左右同时移动
                      {
                          if(!(nums[j]==jbefore&&nums[k]==kbefore))//不能和之前的一样
                         {
                              vector<int> x(3);
                          x[0]=nums[i],x[1]=nums[j],x[2]=nums[k];
                          jbefore=nums[j],kbefore=nums[k];
                          result.push_back(x);
                         }
                          j++;
                          k--;
                      }
                      else if(nums[k]+nums[j]<target)  //小于左移
                      j++;
                      else           //大于右移
                      k--;
                  }
                  i++;
              }
              return result;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值