题目:
题目解析:
- 给定一个整数数组 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的操作!