class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
vector<vector<int>>ans;
for(int i=0;i<=n-3;++i){
if(i&&nums[i]==nums[i-1]) continue;
//求[i+1,n-1]之间sum等于-nums[i]的数对
int l=i+1,r=n-1,target=-nums[i];
while(l<r){
while(l<r&&nums[l]+nums[r]>target) --r;
if(l==r) break;
vector<int>tmp;
if(nums[l]+nums[r]==target){
tmp.push_back(nums[i]),tmp.push_back(nums[l]),tmp.push_back(nums[r]);
ans.push_back(tmp);
if(nums[l]==nums[r]){
break;
}else{
int tmpl=l,tmpr=r;
while(tmpl<tmpr&&nums[tmpl]==nums[l]) ++tmpl;
while(tmpl<tmpr&&nums[tmpr]==nums[r]) --tmpr;
l=tmpl,r=tmpr;
}
}else{
++l;
}
}
}
return ans;
}
};
class Solution {
public:
vector<vector<int>>ans;
void solve(int x,int y,int z){
vector<int>tmp;
tmp.push_back(x),tmp.push_back(y),tmp.push_back(z);
ans.push_back(tmp);
}
vector<vector<int>> threeSum(vector<int>& a) {
sort(a.begin(),a.end());
int n=a.size();
for(int i=0;i<=n-3;){
int l=i+1,r=n-1,sum=-a[i];
while(r>l){
while(r>l&&a[r]+a[l]>sum) --r;
if(l==r) break;
if(a[r]*2==sum&&a[r]==a[r-1]){
solve(a[i],a[r],a[r]);
break;
}
if(a[l]+a[r]==sum){
solve(a[i],a[l],a[r]);
while(r>l&&a[l+1]==a[l]) ++l;
while(r>l&&a[r-1]==a[r]) --r;
++l,--r;
}else{
while(r>l&&a[l+1]==a[l]) ++l;
++l;
}
}
while(i<n-3&&a[i+1]==a[i]) ++i;
++i;
}
return ans;
}
};
本来下面这些代码是写在while(r>l){循环最前面的},但是忘了考虑一些情况。。
如:
if(a[r-1]==a[r]&&a[r]*2==sum){
int cntr=1;
while(r&&a[r-1]==a[r]) --r,++cntr;
ans+=cntr*(cntr-1)/2;break;
}
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int a[N];
int main(){
int n,sum;scanf("%d%d",&n,&sum);
for(int i=0;i<n;++i) scanf("%d",&a[i]);
sort(a,a+n);
int l=0,r=n-1,ans=0;
while(r>l){
while(r>l&&a[r]+a[l]>sum) --r;
if(l==r) break;
if(a[r-1]==a[r]&&a[r]*2==sum){
int cntr=1;
while(r&&a[r-1]==a[r]) --r,++cntr;
ans+=cntr*(cntr-1)/2;break;
}
if(a[r]+a[l]==sum){
int cntl=1,cntr=1;
while(a[r-1]==a[r]) --r,++cntr;
while(a[l+1]==a[l]) ++l,++cntl;
ans+=cntl*cntr;
++l,--r;
}else{//a[r]+a[l]<sum
while(a[l+1]==a[l]) ++l;
++l;
}
}
printf("%d\n",ans);
}