15.三數之和(LeetCode)(中等)

給定一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合爲:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

 

其實和題目16類似稍做修改即可,時間複雜度O(n^2)

主要變動爲

不可重複要處理,

相近改爲相同要處理

class Solution {
    public List<List<Integer>> threeSum(int[] nums) 
    {
              Arrays.sort(nums);//java自帶快排
        List<List<Integer>> result = new LinkedList<>();
        
        int target=0;
        int sum;   	       
        for(int i=0;i<=nums.length-3;i++)//減3因爲最後三個數
        {
        	if(i==0||(i>0&&nums[i]!=nums[i-1]))//我用這個麻煩的方法是因爲我暫時不知道如何和list裏面的數組是否equal,只能在進去分析前把相同的數剃掉
        	{
        		int start=i+1;//第二個數的指針從i後一位開始
        		int end=nums.length-1;//第三個數的指針從最後一位開始
        		while(start<end)
        		{
        			if(start==i+1||(start>i+1&&nums[start]!=nums[start-1]))
        			{
        				if(end==nums.length-1||(end<nums.length-1&&nums[end]!=nums[end+1]))
        				{
        					sum=nums[i]+nums[start]+nums[end];
        					//如果sum比target小,那麼讓sum大一點,即start加1
        					if(sum<target)
        					{
        						start=start+1;
        					}
        					//如果sum比target小,那麼讓sum大一點,即start加1
        					else if(sum>target)
        					{
        						end=end-1;
        					}
        					//一樣可以直接輸出,因爲題目假定唯一最近
        					else 
        					{
        						result.add(new LinkedList<>(Arrays.asList(nums[i],nums[start],nums[end])));
        						start+=1;
        					}
        				}
        				else {end=end-1;}
        			}
        			else {start=start+1;}
        		}
        	}
        }
        return result;
    }
}

 

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