LeetCode – 3Sum — 题解
2016-03-19 22:04
246 查看
题干:
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.
3. Wrong solution version of right answer
I made a mistake when I code the right answer which causes an unaccepted trial.
//3sum
public List<List<Integer>> threeSum(int[] nums) {
/*Wrong version
//Sort Array
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<List<Integer>>();
*/
List<List<Integer>> list = new ArrayList<List<Integer>>();
//Sort Array
Arrays.sort(nums);
//i从0位置遍历到倒数第3个位置
for(int i = 0; i < nums.length-2; i ++){
//避免重复元素
if(i == 0 || nums[i] > nums[i-1]) {
int target = -nums[i];
int start = i + 1;
int end = nums.length - 1;
//use the binary search
while(start < end){
if(nums[start] + nums[end] == target){
List<Integer> temp = new ArrayList<Integer>();
temp.add(nums[i]);
temp.add(nums[start]);
temp.add(nums[end]);
list.add(temp);
start++;
end--;
//avoid duplicate
while(start < end && nums[end] == nums[end+1])
end--;
while(start < end && nums[start] == nums[start-1])
start++;
}else if(nums[start] + nums[end] < target){
start++;
}else{//nums[start] + nums[end] > target
end--;
}
}
}
}
return list;
}
* The solution also does not handle duplicates. Therefore, it is not only time inefficient, but also incorrect.
转自:http://www.programcreek.com/2012/12/leetcode-3sum/
这篇也写得不错,思路可参考:http://www.cnblogs.com/springfor/p/3859670.html
文章有改动。
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.
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.
* 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.
3. Wrong solution version of right answer
I made a mistake when I code the right answer which causes an unaccepted trial.
//3sum
public List<List<Integer>> threeSum(int[] nums) {
/*Wrong version
//Sort Array
Arrays.sort(nums);
List<List<Integer>> list = new ArrayList<List<Integer>>();
*/
List<List<Integer>> list = new ArrayList<List<Integer>>();
//Sort Array
Arrays.sort(nums);
//i从0位置遍历到倒数第3个位置
for(int i = 0; i < nums.length-2; i ++){
//避免重复元素
if(i == 0 || nums[i] > nums[i-1]) {
int target = -nums[i];
int start = i + 1;
int end = nums.length - 1;
//use the binary search
while(start < end){
if(nums[start] + nums[end] == target){
List<Integer> temp = new ArrayList<Integer>();
temp.add(nums[i]);
temp.add(nums[start]);
temp.add(nums[end]);
list.add(temp);
start++;
end--;
//avoid duplicate
while(start < end && nums[end] == nums[end+1])
end--;
while(start < end && nums[start] == nums[start-1])
start++;
}else if(nums[start] + nums[end] < target){
start++;
}else{//nums[start] + nums[end] > target
end--;
}
}
}
}
return list;
}
* The solution also does not handle duplicates. Therefore, it is not only time inefficient, but also incorrect.
转自:http://www.programcreek.com/2012/12/leetcode-3sum/
这篇也写得不错,思路可参考:http://www.cnblogs.com/springfor/p/3859670.html
文章有改动。
相关文章推荐
- 简单html代码标签
- 用Python+Django在Eclipse环境下开发web网站
- 注意转发和重定向的区别
- 利用JQuery实现广告动态滚动特效
- jQuery学习笔记(3)-操作jQuery包装集的函数
- 第三周作业
- HDU 2057 A + B Again
- Java网络编程之NIO编程(待补充)
- 递归算法实例
- Hadoop调优
- Struts和Hibernate整合中分页实现解析
- 插入排序(链表)
- PSR-2 Coding Style Guide
- 双向循环链表
- ReactiveCocoa学习总结
- EL表达式使用了java保留关键字
- 第二个MapReduce程序----flowcount(流量统计,自定义排序,自定义分区)
- 小波变换理论讲解
- IndiaHacks 2016 - Online Edition (Div. 1 + Div. 2) C. Bear and Up-Down 暴力
- 第三周作业