LeetCode – 3Sum
2014-04-23 14:36
465 查看
Problem:
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:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
The solution set must not contain duplicate triplets.
1. Naive Solution
Naive solution is 3 loops, and this gives time complexity O(n^3). Apparently this is not an acceptable solution, but a discussion can start from here.
* The solution also does not handle duplicates. Therefore, it is not only time inefficient, but also incorrect.
Result:
2. Better Solution
A better solution is using two pointers instead of one. This makes time complexity of O(n^2).
To avoid duplicate, we can take advantage of sorted arrays, i.e., move pointers by >1 to use same element only once.
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:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
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)
1. Naive Solution
Naive solution is 3 loops, and this gives time complexity O(n^3). Apparently this is not an acceptable solution, but a discussion can start from here.
public class Solution { public ArrayList<ArrayList<Integer>> threeSum(int[] num) { //sort array Arrays.sort(num); ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> each = new ArrayList<Integer>(); for(int i=0; i<num.length; i++){ if(num[i] > 0) break; for(int j=i+1; j<num.length; j++){ if(num[i] + num[j] > 0 && num[j] > 0) break; for(int k=j+1; k<num.length; k++){ if(num[i] + num[j] + num[k] == 0) { each.add(num[i]); each.add(num[j]); each.add(num[k]); result.add(each); each.clear(); } } } } return result; } }
* The solution also does not handle duplicates. Therefore, it is not only time inefficient, but also incorrect.
Result:
Submission Result: Output Limit Exceeded
2. Better Solution
A better solution is using two pointers instead of one. This makes time complexity of O(n^2).
To avoid duplicate, we can take advantage of sorted arrays, i.e., move pointers by >1 to use same element only once.
public ArrayList<ArrayList<Integer>> threeSum(int[] num) { ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); if (num.length < 3) return result; // sort array Arrays.sort(num); for (int i = 0; i < num.length - 2; i++) { // //avoid duplicate solutions if (i == 0 || num[i] > num[i - 1]) { int negate = -num[i]; int start = i + 1; int end = num.length - 1; while (start < end) { //case 1 if (num[start] + num[end] == negate) { ArrayList<Integer> temp = new ArrayList<Integer>(); temp.add(num[i]); temp.add(num[start]); temp.add(num[end]); result.add(temp); start++; end--; //avoid duplicate solutions while (start < end && num[end] == num[end + 1]) end--; while (start < end && num[start] == num[start - 1]) start++; //case 2 } else if (num[start] + num[end] < negate) { start++; //case 3 } else { end--; } } } } return result; }
相关文章推荐
- LeetCode No.16 3Sum Closest
- 3Sum - Leetcode
- [leetcode]3Sum
- 【leetcode】3Sum
- LeetCode:3Sum Closet
- 3Sum-Leetcode
- Leetcode || 3Sum Closest
- LeetCode之15----3Sum
- Leetcode 3Sum Closest
- LeetCode 015 3Sum
- 【Leetcode】之3sum问题
- leetcode 3Sum
- [LeetCode] 3Sum
- (leetcode)3sum
- leetcode第15题--3Sum
- [LeetCode] 015. 3Sum (Medium) (C++/Java/Python)
- [LeetCode] 3Sum Closest
- LeetCode - 3Sum
- LeetCode 15 3Sum 找出数组里面3个数的和等于指定值。
- [leetcode 259]3Sum Smaller