1.三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
解题思路:
a + b + c = 0 => a + b = -c; 那么此问题转换成 两数之和问题!
对C我们可以在数组中一 一枚举。在数组的其他部分中找到符合条件的a,b组。
在无序数组中,由于无法确定a、b位置,所以a和b只能遍历一 一枚举,直至满足条件。这种做法,嵌套三重循环。时间复杂度为O(n^3).属于暴力解法。
对有序数组,特点是递增排列,可以采用双指针法a 从最左端开始寻找,b从最右端开始寻找:
- a + b < -c , 减小 a + b的值。只能减小b,故b向左移动一位。
- a + b > -c,增大a + b的值,只能增大a,故a向右移动一位。
- a + b = -c, 寻找到目标数。
例如:nums = [-1, 0, 1, 2, -1, -4]。
1. c = -4
不存在 a + b -4 = 0.
2.c =-1
a = -1,b = 2 ,c = -1.
a = 0,b=1,c=-1
这样就找到了两组[[-1,2,-1],[0,1,-1]].
但这里还存在问题,如何满足 【不重复的三元组】?
1. 为什么,左指针每次为目标数的下一位。为了避免重复。
例如,对于上述数组。
当目标数为 C = -1 时。
当目标数C = -1(第二个)时.
两个得到结果相同
2. 上一次枚举数不能和本次枚举数相同。
如果本次枚举数与上一次相同,跳过本次查找。
例如[0,0,0,0]
问题一: