鏈接: https://oj.leetcode.com/problems/3sum/
2sum:尺取法 通過a+b與target比較,.根據大於或小於不斷縮小範圍
3sum:即對0~n個數分別做2sum...
去重:
if(i!=0&&num[i]==num[i-1])
continue;
只有當i==0或者當前的數!=上一個數時才繼續計算2sum
下面簡單說明一下:
當前數爲num[i]時,則需要在num[i+1~n]中找到一個2sum==-num[i]; 但是因爲num[i]==num[i-1],該2sum肯定會被case2中,重複 //case1
當前數爲num[i-1]時,需要在num[i~n]中找到一個2sum==-num[i-1];, //case2
當時只這樣判斷去重是不行的.測試數據:
-2,0,0,2,2
還需要加上
if(!ans.contains(tans))
完整代碼:
public class Solution
{
public List<List<Integer>> threeSum(int[] num )
{
List<Integer> tans=new ArrayList<Integer>();
List<List<Integer>> ans=new ArrayList<List<Integer>>();
Arrays.sort(num);
for(int i=0;i<num.length-2;i++)
{
int l=i+1,r=num.length-1;
if(i!=0&&num[i]==num[i-1])
continue;
while(l<r)
{
if(num[l]+num[r]+num[i]==0)
{
tans.add(new Integer(num[i]));
tans.add(new Integer(num[l]));
tans.add(new Integer(num[r]));
if(!ans.contains(tans))
{
ans.add(new ArrayList<Integer>(tans));
}
tans.clear();
l++;
r--;
}
else if(num[l]+num[r]+num[i]<0)
{
l++;
}
else
{
r--;
}
}
}
return ans;
}
}