三数之和
核心思路:双指针
时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 对数列进行从小到大的排序,从而对求和的范围有预期(例如当前的值为正,则之后之和必然为正)
- 主指针:沿着从小到大的顺序遍历数列【遍历】
- 头尾移动指针:在主指针之后的范围内遍历至相遇,通过和与0的大小关系,移动两个指针的位置
四数之和
时间复杂度: O ( n 3 ) O(n^3) O(n3)
vs. 三数之和
- 在三数之和的基础上,再加一层for循环
- 求和的target未必为0,因此要慎重进行剪枝(例如:和target的大于关系会受到负数的影响)
细节 - 去重
- 对于两个for主循环,都要去重,但要确保第一个unique的元素必须要被计算到(所以跟i-1,即前一位相比)
- 因为第一个重复元素所对应的双指针集合包含了之后重复元素对应的双指针集合
- 双指针中去重,已经使用过的指针不必再使用,对于调整
sum_
(循环内临时sum
值)没有作用,因此和下一位相比