c++学习记录(双指针)
双指针-学习记录
前面做了力扣的三数之和,一顿操作猛如虎,击败用户百分五。
一直以来我都不擅长总结,学的东西杂,养成的学习习惯和思维方式都不太好,以后用心做好研究生生涯学习阶段的记录。
题目为找出数组nums中所有满足条件 a + b + c = 0且不重复的三元组,若在不存在任何条件的情况下,枚举所有的三元组合我们会使用三重循环,还需要去重操作,这个方法空间复杂度和时间复杂度都会很高,因此我们需要利用题设条件,三个元素中有一个元素确定后,另外两个是存在线性关系的。
已知,当我们第一层循环枚举到a,第二层循环枚举到b时,c是唯一确定的(但不一定存在于数组)。
当第二层循环继续枚举元素b1,若b1>b,a+b1+c1=0必然有c1<c;反之同理。
若b存在增大趋势,那c就应该是减小趋势,反之同理。那要怎么保证指针指向元素变化趋势统一,这里我们将数组进行排序。
如图:
关于去重:
由于经过排序,相同的数已经排列再一起,假设first-1与first指向元素相同,其实再执行循环时,first-1已经将元素nums[first-1]所有情况枚举完成,元素nums[first]的组合情况是包含在内的,所以我们进行一个判断:
if(nums[first-1]==nums[first]) continue;
对于second所指向元素同理。