leetcode--【15】三数之和

本文详细解析了经典的三数之和问题,并提供了一种高效的双指针解决方案。通过示例展示如何寻找数组中三个元素的组合,使它们的总和为零,同时避免重复的三元组。

题目:三数之和

给你一个包含 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 = []
输出:[]
输入:nums = [0]
输出:[]

题解

双指针:

step1:对数组进行排序

step2:对已经排序对数组,进行遍历

step3:如果当前数组数量少于3,则返回空

step4:假设nums[i]已定,寻找另外的两个数字

step5:在找两个两个数字时,一个从L=i+1开始,一个从R=len-1开始,采用双指针

step6:如果三者之和等于0,则记录在结果中,此时需要注意的需要去重

在整个过程中,比较重要的一个是去重,涉及到的三个数字,均需要去重

nums[i]去重:nums[i] = nums[i-1]说明该数字,已经寻找过,直接跳过

nums[L] = nums[L+1]:找到满足条件的L后,需要对其进行去重,后面相等的数字,直接跳过

nums[R] = nums[R-1]:找到满足条件的R后,需要对其去重,前面有相等的数字,直接跳过

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
  const ans = [];
  const len = nums.length;
  //如果数组不足三个数字,直接返回
  if(nums == null || len <3) return ans;
  //进行排序
  nums.sort((a,b)=>a-b)
  //假设nums[i]值已定,寻求另外两个值,使其三者之和为0
  for(let i =0;i<len;i++){
      //如果当前值大于0,那么不存在满足条件的
      if(nums[i] >0) break;
      //如果该值与前一个值相同,则去重
      if(i>0 && nums[i] === nums[i-1]) continue
      //寻求另外两个数
      let L = i + 1;
      let R = len -1;
      //开始寻找剩下的两个数
      while(L<R){
         let sum = nums[i] + nums[L] + nums[R]
          if(sum === 0){
            //满足条件,放入数组中
            ans.push([nums[i],nums[L],nums[R]])
            //进行去重
            while(L<R && nums[L] == nums[L+1]) L++;
            while(L<R && nums[R] == nums[R+1]) r++;
            //去重结束后,在找剩下的满足条件的两个数,因此需要左右移动指针
            L++;
            R--;
          }else if(sum < 0) {L++} 
          else if(sum > 0) {R--; }
      }
  }
  return ans
};


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值