排序后for循环+双指针。
大体思路:虽说是双指针,其实类似于三指针,只不过第一个指针没有起到动态移动的效果。第一个指针固定后,后面两个指针动态规划,由于排序完成,这个动态分析就很好进行。
难点:需要把重复的数据去掉,所以指针移动的时候都要有个判断,就是移动前后的值是否发生了改变。若不变则会有重复数据出现。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n=len(nums)
re=[]
if n<3:
return []
nums.sort()
a=0.1
for i in range(n-2):
if a==nums[i]:
continue
a=nums[i]
if a>0:
break
l=i+1
r=n-1
while l<r:
s=nums[i]+nums[l]+nums[r]
if s==0:
re.append([nums[i],nums[l],nums[r]])
while r>l and nums[r]==nums[r-1]:
r=r-1
r=r-1
while r>l and nums[l]==nums[l+1]:
l=l+1
l=l+1
if s>0:
while r>l and nums[r]==nums[r-1]:
r=r-1
r=r-1
if s<0:
while r>l and nums[l]==nums[l+1]:
l=l+1
l=l+1
return re
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> ans;
int y,z;
int n=nums.size();
if(n<3) return {};
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(nums[i]>nums[j])
{
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
float x=0.1;
for(int i=0;i<n-2;i++)
{
if(x==nums[i]) continue;
x=nums[i];
if(nums[i]>0) break;
int l=i+1;
int r=n-1;
while(l<r)
{
y=nums[l];
z=nums[r];
if(x+y+z==0)
{
ans.push_back({x,y,z});
while(r>l&&nums[l]==nums[l+1])
l++;
l++;
while(r>l&&nums[r]==nums[r-1])
r--;
r--;
}
if(x+y+z>0)
{
while(r>l&&nums[r]==nums[r-1])
r--;
r--;
}
if(x+y+z<0)
{
while(r>l&&nums[l]==nums[l+1])
l++;
l++;
}
}
}
return ans;
}
};
C++击败比例虽然比不过python,可是他运行时间确实快。能把效率变成原来的800%。