1. 程式人生 > >leetcode 15. 三數之和(3Sum)

leetcode 15. 三數之和(3Sum)

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

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

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

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

原題連結

思路:

這題可以使用雜湊表,我這裡沒用,用的算是三指標,從小到大排好後,當第一個指標都大於0了,那3個指標的值加起來不可能等於0了,此時break,為了不重複,最內層的while 實現了排重

class Solution {
    
    public List<List<Integer>> threeSum(int[] nums) {
    	List<List<Integer>> ans = new ArrayList<>();
    	Arrays.sort(nums);
    	
    	
    	for(int k=0;k<nums.length - 1;k++)
    	{
    		if(nums[k]>0)
    			break;
    		if(k>0 && nums[k]==nums[k-1])
    			continue;
    		
    		int l = k+1;
    		int r = nums.length - 1;
    		int target = 0 - nums[k];
    		while(l<r)
    		{
    	    	List<Integer> list = new ArrayList<>();
                while(l+1<r && nums[l+1]==nums[l])
    				l++;
    			while(l+1<r && nums[r-1]==nums[r])
    				r--;    	    
    			if(nums[l] + nums[r] == target)
    			{
    				list.add(nums[k]);
    				list.add(nums[l]);
    				list.add(nums[r]);
    				ans.add(list);

    				l++;
    				r--;
    			}
    			else if(nums[l] + nums[r] < target)
    				l++;
    			else
    				r--;
    		}
    	}
    	
		return ans;
        
    }
}