15-三数之和

第一眼看到这道题,暴力解决,不仅时间复杂度O(n^3),而且我还没有去重,也没有想排序啥的。后来感觉确实麻烦,就去看题解了,看完后恍然大悟,居然又是用的双指针来做的,觉得比较好的题解是先对数组进行排序,然后从最小的元素遍历到最大元素,当nums[i] >0 时则跳出循环,因为如果nums[i]都大于0,那么三个大于0的数加起来肯定大于0,l=i+1  r = len(nums)-1,这样可以避免循环再去考虑i左侧的变量,把i就作为最小值,当nums[i] + nums[l] + nums[r] <0 时,说明l太小,而此时i是固定的,不能改变,则将i加1,同理当>0时说明r太大,则r-1,直到l==r时跳出内循环,逻辑想清楚了,比较麻烦的一点就是去重,因为已经排好序了,三个数相加为0,inums[i]+nums[l]+nums[r] == 0  如果其中两个数相等,那么第三个数就已经确定了,则这种情况可以跳过直到不等,所以可以得出关系式 for nums[l] == nums[l+1] && l<r {

l++ }      同理对于r来说 for nums[r] == nums[r-1] && l < r {

r-- }

和为0时r--,l++ 

r--和l++在这种情况下要同时进行,因为和为0了,i固定,如果只是改变l,那么假如r满足了条件,这种也是重复的,不能计入

代码如下:

15-三数之和