LeetCode 15. 3Sum(三數之和)
阿新 • • 發佈:2017-07-12
while arr cnblogs 關鍵點 next 資料 () code find
題目標簽:Array 這道題目給了我們一個nums array, 讓我們找到所有任意三個數字加起來等於0的可能性,但是不能重復。這道題目我們要運用Two Sum(Two pointers)方法來幫助完成,那麽我們首先就要sort array。這樣才可以利用Two Sum。也可以幫助避免重復的數字。然後遍歷nums array,這裏只需要遍歷到最後倒數第三個就可以了,因為一共需要三個數字,後面只有兩個數字的時候,沒必要。對於每一個數字,把它* -1,比如說題目中的例子: -4 -1 -1 0 1 2, 把-4 * -1 = 4, 然後需要在後面的array 裏找到兩個數字之和等於4的。這樣就是在做Two Sum題目了。如果遇到-1 -1這種情況,第一個-1 我們需要,在後面array 裏找兩數之和等於1的。當遇到第二個重復的,直接skip。同樣的,在後面的array裏找兩數之和的話,遇到第二個重復的也跳過。
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
題目標簽:Array 這道題目給了我們一個nums array, 讓我們找到所有任意三個數字加起來等於0的可能性,但是不能重復。這道題目我們要運用Two Sum(Two pointers)方法來幫助完成,那麽我們首先就要sort array。這樣才可以利用Two Sum。也可以幫助避免重復的數字。然後遍歷nums array,這裏只需要遍歷到最後倒數第三個就可以了,因為一共需要三個數字,後面只有兩個數字的時候,沒必要。對於每一個數字,把它* -1,比如說題目中的例子: -4 -1 -1 0 1 2, 把-4 * -1 = 4, 然後需要在後面的array 裏找到兩個數字之和等於4的。這樣就是在做Two Sum題目了。如果遇到-1 -1這種情況,第一個-1 我們需要,在後面array 裏找兩數之和等於1的。當遇到第二個重復的,直接skip。同樣的,在後面的array裏找兩數之和的話,遇到第二個重復的也跳過。
Java Solution:
Runtime beats 82.41%
完成日期:07/11/2017
關鍵詞:Array
關鍵點:利用TwoSum(two pointers)來輔助
1 public class Solution 2 { 3 public List<List<Integer>> threeSum(int[] nums) 4 { 5 Arrays.sort(nums); 6 List<List<Integer>> res = new ArrayList<>(); 7 8for(int i=0; i<nums.length-2; i++) // no need to find twoSum if rest array size is only 1 or 0 9 { 10 if(i > 0 && nums[i] == nums[i-1]) // if previous num is same, skip this num 11 continue; 12 13 // for each num, find the twoSum which equal -num in the rest array 14 int left = i + 1; 15 int right = nums.length-1; 16 int sum = nums[i] * -1; 17 18 while(left < right) 19 { 20 if(nums[left] + nums[right] == sum) // find the two 21 { 22 res.add(Arrays.asList(nums[i], nums[left], nums[right])); // ascending order 23 left++; 24 right--; 25 26 while(left < right && nums[left] == nums[left-1]) // if next num is same as this, skip this 27 left++; 28 while(left < right && nums[right] == nums[right+1]) 29 right--; 30 } 31 else if(nums[left] + nums[right] > sum) // meaning need smaller sum 32 right--; 33 else // nums[left] + nums[right] < sum, meaning need larger sum 34 left++; 35 } 36 37 } 38 39 return res; 40 } 41 }
參考資料:
https://discuss.leetcode.com/topic/8125/concise-o-n-2-java-solution
LeetCode 算法題目列表 - LeetCode Algorithms Questions List
LeetCode 15. 3Sum(三數之和)