LeetCode 3sum

鏈接: 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;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章