力扣https://leetcode-cn.com/problems/3sum/
C#
// //暴力-超时
// public class Solution {
// public IList<IList<int>> ThreeSum(int[] nums) {
// var ret=new List<IList<int>>();
// Array.Sort(nums);
// for(int a=0;a<nums.Length-2;a++){
// //去重
// if(a>0&&nums[a]==nums[a-1]){
// continue;
// }
// for(int b=a+1;b<nums.Length-1;b++){
// //去重
// if(b>a+1&&nums[b]==nums[b-1]){
// continue;
// }
// for(int c=b+1;c<nums.Length;c++){
// //去重
// if(c>b+1&&nums[c]==nums[c-1]){
// continue;
// }
// if(nums[a]+nums[b]+nums[c]==0){
// var tmp=new List<int>(){nums[a],nums[b],nums[c]};
// ret.Add(tmp);
// }
// }
// }
// }
// return ret;
// }
// }
//排序+双指针
//排序后固定一个元素,然后双指针
//双指针-左右指针
public class Solution {
public IList<IList<int>> ThreeSum(int[] nums) {
var ret=new List<IList<int>>();
Array.Sort(nums);
for(int i=0;i<nums.Length-2;i++){
//去重
if(i>0&&nums[i]==nums[i-1]){
continue;
}
int left=i+1;
int right=nums.Length-1;
while(left<right){
int sum=nums[i]+nums[left]+nums[right];
if(sum==0){
var tmp=new List<int>(){nums[i],nums[left],nums[right]};
ret.Add(tmp);
//去重
while(left<right&&nums[left]==nums[left+1]){
left++;
}
while(left<right&&nums[right]==nums[right-1]){
right--;
}
left++;
right--;
}else if(sum<0){
left++;
}else if(sum>0){
right--;
}
}
}
return ret;
}
}