在
n
n
n个数字中所有可能的三元组有
C
n
3
C^{3}_{n}
Cn3 种。
由于数组中含有重复元素,为保证结果的唯一性,对数组进行排序预处理。
题目要求三个数的和为一个定值,那么只需要确定前两个数,第三个数字也被确定。
用两个for
循环枚举可能的组合,过程中略过重复的数字。
第一个指针a
更新时,重置第三个指针c
到数组最大的元素。
由于指针b
在遍历过程中不断变大,指针c
从最后一个数开始向前枚举,,若当前和超过target
,
无论b
如何增大,c
之后的组合都不成立,b,c
相遇时停止,时间复杂度
O
(
N
)
O(N)
O(N)
a
是遍历的过程,b, c
为双指针过程,总的时间复杂度为
O
(
N
2
)
O(N^2)
O(N2)
附上代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> out;
if(nums.size() < 3) return out;
sort(nums.begin(), nums.end());
int a = 0, b = 1, c = nums.size()-1, target = 0;
for(a = 0; a < nums.size()-2; a++){
if(a != 0 && nums[a-1] == nums[a]) continue;
c = nums.size()-1;
for(b = a+1; b < nums.size()-1; b++){
if(b != a+1 && nums[b-1] == nums[b]) continue;
while(c > b && nums[a]+nums[b]+nums[c] > target) c--;
if(b >= c) break;
if(nums[a]+nums[b]+nums[c] == target) out.push_back(vector<int>{nums[a], nums[b], nums[c]});
}
}
return out;
}
};