题目
描述
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。
数据范围:0≤n≤1000,数组中各个元素值满足 ∣val∣≤100
空间复杂度:O(n2),时间复杂度 O(n2 )
注意:
三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
解集中不能包含重复的三元组。
思路
先进行排序,用一个指针来遍历数组,另外两个分别负责第一个指针之后的数,一个指向起始位置,另一个指向终点位置,判断是否满足条件。过程中要注意对重复元素的处理。
代码
python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param num int整型一维数组
# @return int整型二维数组
#
class Solution:
def threeSum(self , num: List[int]) -> List[List[int]]:
# write code here
res = []
length = len(num)
if length==0:
return res
num.sort()
for m in range(length):
if(m!=0 and num[m]==num[m-1]):
continue
i = m+1
j = length-1
while(j>i):
if(num[m]+num[i]+num[j]==0):
res.append([num[m], num[i], num[j]])
while(num[i]==num[i+1] and i+1 < j):
i += 1
while(num[j]==num[j-1] and j-1 > i):
j -= 1
i += 1
j -= 1
elif(num[m]+num[i]+num[j]>0):
j -= 1
elif(num[m]+num[i]+num[j]<0):
i += 1
return res
c++版本:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>> res;
if(num.size()<3){
return res;
}
sort(num.begin(), num.end());
for(int m = 0; m<num.size(); m++){
if(m&&num[m]==num[m-1]){
continue;
}
int i = m+1;
int j = num.size()-1;
while(j>i){
if(num[i] + num[j] + num[m]==0){
vector<int> ele = {num[m],num[i], num[j]};
res.push_back(ele);
while(num[i]==num[i+1]&&i+1<j){
i++;
}
while(num[j]==num[j-1]&&j-1>i){
j--;
}
i++;
j--;
}
else if(num[i] + num[j] + num[m]>0){
j--;
}
else if(num[i] + num[j] + num[m]<0){
i++;
}
}
}
return res;
}
};