LeetCode系列之15---3Sum
阿新 • • 發佈:2019-01-10
題目地址:https://leetcode.com/problems/3sum/
題目:
給定n個整數的陣列nums,nums中是否有元素a,b,c,a + b + c = 0? 找到陣列中所有唯一的三元組,它們的總和為0。
注意:
解決方案集不得包含重複的三元組。
例:
給定陣列nums = [-1,0,1,2,-1,-4],
解決方案集是:
[
[-1,0,1],
[-1,-1,2]
]。
才接觸的該題庫題目,不是很熟悉, 我首先自己想了想,最笨的辦法就是遍歷所有的數字三遍,找到滿足條件的首先對陣列排序(時間複雜度為
public List<List<Integer>> threeSum(int[] nums) { int n = nums.length; Arrays.sort(nums); List<List<Integer>> result = new ArrayList<>(); for (int i = 0; i <n ; i++) { while (i > 0 && nums[i] == nums[i-1]){ i = i+1; } for (int j = i+1; j < n; j++) { while (nums[j] == nums[j-1]){ j = j+1; } for (int k = j+1; k < n; k++) { while (nums[k] == nums[k-1]){ k = k+1; } if (nums[i] + nums[j] + nums[k] == 0){ List<Integer> yigejie = new ArrayList<>(); yigejie.add(nums[i]); yigejie.add(nums[j]); yigejie.add(nums[k]); result.add(yigejie); } } } } return result; }
思前想後還是不得要領. 我就看了一下討論區. 果然有高手.
public static List<List<Integer>> threeSum(int[] num) { Arrays.sort(num); //排序 List<List<Integer>> res = new LinkedList<>(); for (int i = 0; i < num.length-2; i++) { //一個迴圈複雜度為n if (i == 0 || (i > 0 && num[i] != num[i-1])) { //對陣列第一個元素進行去重 int lo = i+1, hi = num.length-1, sum = 0 - num[i];//將第一個元素設為目標值 while (lo < hi) {//使用while只需遍歷一遍 if (num[lo] + num[hi] == sum) { res.add(Arrays.asList(num[i], num[lo], num[hi])); while (lo < hi && num[lo] == num[lo+1]) lo++;//對第二元素去重 while (lo < hi && num[hi] == num[hi-1]) hi--;//對第三個元素去重 lo++; hi--; } else if (num[lo] + num[hi] < sum) lo++;//總和小於目標值,增加第二個元素的下標 else hi--;//總和大於目標值,減小第三個元素的下標 } } } return res; }
其複雜度為. 對陣列進行了兩次遍歷就得到了結果. https://leetcode.com/problems/3sum/discuss/7380/Concise-O(N2)-Java-solution