【发布时间】:2017-04-15 19:10:52
【问题描述】:
我正在研究 3 Sum 以自己实现它,并遇到了以下带有规则的实现:
给定一个包含 n 个整数的数组 S,S 中是否存在元素 a、b、c 使得 a + b + c = 0?查找数组中所有唯一的三元组,其总和为零。
注意:三元组 (a,b,c) 中的元素必须按非降序排列。 (即a≤b≤c) 解决方案集不得包含重复的三元组。
For example, given array S = {-1 0 1 2 -1 -4},
A solution set is:
(-1, 0, 1)
(-1, -1, 2)
以及实现(对数组进行排序,遍历列表,并使用另外两个指针接近目标):
import java.util.*;
public class ThreeSum {
List<List<Integer>> threeSum(int[] num) {
Arrays.sort(num);
List<List<Integer>> res = new LinkedList<>();
for (int i=0; i<num.length-2; i++) {
if (i==0 || (i>0 && num[i] != num[i-1])) { //HERE
int lo = i+1;
int hi = num.length-1;
int sum = 0 - num[i];
while (lo < hi) {
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++; //HERE
while (lo < hi && num[hi] == num[hi-1]) hi--; //HERE
lo++; hi--;
} else if (num[lo] + num[hi] < sum) lo++;
else hi--;
}
}
}
return res;
}
//Driver
public static void main(String args[]) {
ThreeSum ts = new ThreeSum();
int[] sum = {-1, 0, 1, 2, -1, -4};
System.out.println(ts.threeSum(sum));
}
}
我的问题是(位于评论位置://HERE),检查num[i] != num[i-1]、num[lo] == num[lo+1] 和num[hi] == num[hi-1] 的原因是什么?假设他们应该跳过相同的结果,但这意味着什么?例子真的很有帮助。
提前感谢您,我们将接受回答/赞成票。
【问题讨论】:
-
这总是相同的逻辑,如果有两个相同的值,你会得到相同的三元组结果,所以你跳过它。这可以通过简单地删除我猜的列表中的重复项来完成。
-
@AxelH 不,不能删除重复项 - 具有重复 {-1-1,2} 的三元组有效
-
@MBo 确实如此!没想到
标签: java arrays algorithm list