leetcode三數之和等於0(去重)
阿新 • • 發佈:2018-12-31
題目:
給定一個包含 n 個整數的陣列 nums
,判斷 nums
中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4], 滿足要求的三元組集合為: [ [-1, 0, 1], [-1, -1, 2] ]
java 程式碼:
class Solution { public List<List<Integer>> threeSum(int[] nums) { //先排好序 for(int i=0;i<nums.length;i++){ for(int j=i+1;j<nums.length;j++){ if(nums[i]>nums[j]){ int temp=nums[i]; nums[i]=nums[j]; nums[j]=temp; } } } List<List<Integer>> list=new ArrayList<>(); int i=0; //先固定第一個數,然後根據三個數的和大於還是小於0移動後兩個數 //下面出現的所有continue都是為了去重 while(i<nums.length){ if(nums[i]>0) return list; if(i>0&&nums[i-1]==nums[i]){ i++; continue; } //第二個數在頭部,第三個數在尾部 for(int j=i+1,k=nums.length-1;j<k;){ if(j>i+1&&nums[j-1]==nums[j]){ j++; continue; } if(k<nums.length-1&&nums[k]==nums[k+1]){ k--; continue; } int temp=nums[i]+nums[j]+nums[k]; if(temp>0) k--; else if(temp<0) j++; else{ List<Integer> list1=new ArrayList<>(); list1.add(nums[i]); list1.add(nums[j]); list1.add(nums[k]); list.add(list1); j++; k--; } } i++; } return list; } }
注意去除重複的結果。設一個滿足條件的三元組<a,b,c>,如果有重複的三元組與之相同,則說明a,b,c中至少有一個元素的值在陣列中出現至少兩次。假如a的值2,在陣列中出現多次,則其必然是連續的(陣列已經排序),因此可以使用如上的方法去除重複的三元組。該方法時間複雜度O(nlogn)+O(n^2),空間複雜度為O(1)。