using System;
using System.Collections.Generic;
class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型一维数组
* @return int整型二维数组
*/
public List<List<int>> threeSum (List<int> num) {
// write code here
List<List<int>> ans=new List<List<int>>();
num.Sort();
int preI=-101;
int preJ=-101;
for(int i=0;i<num.Count;i++)
{
if(num[i]==preI)
continue;
else
preI=num[i];
for(int j=i+1;j<num.Count;j++)
{
if(preJ==num[j])
continue;
else
preJ=num[j];
var s=-1*(num[i]+num[j]);
if(num.Contains(s))
{
if(num.LastIndexOf(s)>j)
{
ans.Add(new List<int>{num[i],num[j],s});
// if(s==0 && num[j]==0)
// {
// i=num.LastIndexOf(s);
// break;
// }
}
}
}
}
return ans;
}
}
两重遍历没什么好说的,为了升序,先将数组排序,这样放入结果时就是升序的了。
核心在于去重复,这里引入了2个变量preI,preJ就是为了记录上一次num[i]和num[j]的值,例如 -2 0 0 2 2,当 {-2 0,2}第一次被加入后 j++, num[j]依然为0,这时候就要跳过去。
顺带一提的是: a+b+c=0中,由于a<=b<=c,而数列升序,所以c的下标一定要大于 i,j,否则,不能保证升序顺序



京公网安备 11010502036488号