3sum

一直没看清英文题目,导致各种WA!唉唉唉。。。
通过Judge Small后:

public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
int length = num.length;
ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list;
for (int i = 0; i < length - 2; ++i)
for (int j = i + 1; j < length - 1; ++j)
for (int k = j + 1; k < length; ++k){
int sum = num[i] + num[j] + num[k];
if (sum == 0){
list = new ArrayList<Integer>();
list.add(num[i]);
list.add(num[j]);
list.add(num[k]);
Collections.sort(list);
if (!results.contains(list))
results.add(list);
}

}
return results;
}
}

尝试O(N2)算法

public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
int length = num.length;
ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list;
ArrayList<Integer> input = new ArrayList<Integer>();
for (int i = 0; i < length; ++i)
input.add(num[i]);
Collections.sort(input);

HashMap<Integer, ArrayList<ArrayList<Integer>>> map = new HashMap<Integer, ArrayList<ArrayList<Integer>>>();
for (int i = 1; i < length - 1; ++i)
for (int j = i + 1; j < length; ++j){
//ArrayList<ArrayList<Integer>> tempBucket = new ArrayList<ArrayList<Integer>>();
int sum = input.get(i) + input.get(j);
ArrayList<Integer> tempBucket = new ArrayList<Integer>();
tempBucket.add(i);
tempBucket.add(j);
tempBucket.add(input.get(i));
tempBucket.add(input.get(j));
if (map.containsKey(sum))
map.get(sum).add(tempBucket);
else{
ArrayList<ArrayList<Integer>> tempList = new ArrayList<ArrayList<Integer>>();
tempList.add(tempBucket);
map.put(sum, tempList);
}
}

for (int i = 0; i < length - 1; ++i)
for (int sum: map.keySet())
if (input.get(i) + sum == 0){
ArrayList<ArrayList<Integer>> tempList = map.get(sum);
for (ArrayList<Integer> li: tempList)
if (li.get(0) > i){
list = new ArrayList<Integer>();
list.add(input.get(i));
list.add(li.get(2));
list.add(li.get(3));
if (!results.contains(list))
results.add(list);
}
}
return results;
}
}


最后在stackoverflow上找到了答案 唉
http://stackoverflow.com/questions/10732522/difference-between-two-similar-algorithms-of-3sum

public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
Arrays.sort(num);
HashSet<ArrayList<Integer>> lstSoln = new HashSet<ArrayList<Integer>>();

ArrayList<Integer> tempArr = null;
for (int i = 0; i < num.length; i++) {
int j = i + 1;
int k = num.length - 1;
while (j < k) {
int sum3 = num[i] + num[j] + num[k];
if (sum3 < 0) {
j++;
} else if (sum3 > 0) {
k--;
} else {
tempArr = new ArrayList<Integer>();
Collections.addAll(tempArr, num[i], num[j], num[k]);
lstSoln.add(tempArr);
j++;
k--;
}
}
}

return new ArrayList<ArrayList<Integer>>(lstSoln);
}

第二天想了一下,发现其实还是三重循环,k其实就是j里面的一层循环,只是说看上去变成了两重循环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值