Problem: 15. 三数之和
不要忘记最后再 left++,right–
思路
主要还是去重
其实这道题不推荐用哈希表做
因为去重太麻烦了,有很多细节不会注意到
所以我们用双指针做
- 对数组排序,因为我们不需要返回下标,排序下标乱了也没有关系
- 三个指针,i,left、,right
- 开始循环for(i++)
- 如果
nums[i]
大于0,直接return,排序之后第一个数大于零后面就没有负数了 - 剔除重复元素,判断i位置之前有没有与他相同的元素,if(i > 0 &&
nums[i] == nums[i-1]
) continue; - while(left<right)
- 当
nums[i] + nums[left] + nums[right] > 0
- 说明right大了,right–
- 当
nums[i] + nums[left] + nums[right] < 0
- 说明left小了,left–
- 否则等于0
- 将
nums[i] , nums[left] , nums[right]
放入结果集 - 进行去重
- 当有与left右边有与
nums[left]
相同的元素while (right > left && nums[left] == nums[left + 1])
- left++
- 当有与right左边有与
nums[right]
相同的元素while (right > left && nums[right] == nums[right - 1])
- right–
- 最后再 left++,right–
- 将
- 当
- 如果
复杂度
- 时间复杂度:
$O(n^2)$
- 空间复杂度:
$O(n)$
Code
1 | class Solution |