双指针算法_三数之和

 

题目:

题目解析: 

  • 给定一个整数数组 nums ,判断是否存在三元组nums[i]、nums[j]、nums[k],满足 i!=j  且 i!=k  且 j!=k
  • 也就是同一个位置只能选择一次!,且还要满足三个数相加等于0,同一个位置只能选择一次!
  • 答案中不可以包含重复的三元组、如下图所示,虽然有三组,但是其中两组虽然顺序不一样但是内部的数值是一样的也不行!

算法原理: 

双指针在最左边先固定一个数值,随后剩下的区间范围内挑出两个数能和这个数值加在一起等于0的即可! 

同时需要注意的是 a 是需要小于等于0的,在我们之后的数组排序操作后,对a的一种优化,因为是排序,如果a大于0那么后面的数字都大于0,加在一起是无法达到等于0的地步的!

大概就是和大于-a则右边指针往左移动,小于-a左边指针往右移动,等于后记录下来随后双方分别右边移动左边移动!直到相遇,

后开始第二轮,a向右移动,且在第二轮的时候先检查固定的数a是否是和之前的a一样如果一样跳过,不一样则固定,然后继续和之前一样的操作!

代码实现: 

  • 第一个去重操作,就是下一个数字和上一个数字一样,就继续往前或者往后走,当然为了防止越界,设置了范围
  • 而设置的范围就是在left和right之间
  • 第二个去重操作就是在一轮过后,同时先i++判断以下下一个数和上一个数是不是一样,如果一样就往前走
  • 也需要注意越界,而注意越界的范围就是要在数组内,而数组的长度是n 所以最高只能n-1
  • 前面一大段sum和-a的比较,这里的-a是target 就是大于-a右指针左移动,小于-a左指针右移动,然后等于-a就使用push插入操作,且左右指针同时移动一步,进一步开始进行探查操作!直到二者相遇!
  • 在一轮结束后 固定的数字a需要进行往后移动,然后开始新的一轮循环查找两个数之和是-a的操作!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值