由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 求个4sum的算法
相关主题
LeetCode 的 4 sum 问题 如何用hash table做呢?combination sum II
4sum o(n^2)超时java 求助
3sum on LeetCode OJ请问如何去除结果里面的重复
leetcode上遇到的问题一道面试题和解法(求指点).
leetcode 4sum N^3解法有时Time Limit Exceeded有时又能通过请教一下subset I 输出子集顺序问题
LC 4-sum相当麻烦啊如何避免permutation中的重复计数
求高手解答cs 面试题?一道面试题
leetcode的3sum的运行时间问题permutationII ,如果不用hashset,用迭代的方法,如何防止重复
相关话题的讨论汇总
话题: arraylist话题: int话题: num话题: integer话题: sum
进入JobHunting版参与讨论
1 (共1页)
c********p
发帖数: 1969
1
leetcode变聪明了吧?
我的4sum明明可以过大oj的,怎么现在过不了了?
谁有好点的版本?
我的版本是:
把两两的和,放到hashtable里,有重复数字,也重复一遍,hashtable里的值是int[2]
, 每个值表示index而不是值。key是sum。
两两的sum在int[] sum中再存一遍。然后sort。里边有重复的。
return的结果放到hashset里,避免重复。
然后把两两sum过一遍,遇到target - sum[i]在hashtable里存在的,把hashset里的这
2个key对应int[]都就试一次,去看每一组index是否有重复,没有,就排列好,塞
return的hashset里。
以前可以的,现在只能过小oj了。。。桑心。。。
求高人指教。
l********y
发帖数: 1559
2
照着2sum写。o(n^3)
c********p
发帖数: 1969
3
过不去了,我写的就是这个。。。
你去试试你以前写的版本,看能不能过。。。
我试了2个版本,加上我新写的,都过不去了。。。

【在 l********y 的大作中提到】
: 照着2sum写。o(n^3)
s*******n
发帖数: 305
4
羡慕呀, 楼上都刷第二遍了
z****e
发帖数: 54598
5
leetcode 不超过两秒就可以过大oj
我用了800毫秒,还有1200毫秒富余
把你的code贴上来看看
Run Status: Accepted!
Program Runtime: 864 milli secs
public class Solution {
public ArrayList> fourSum(int[] num, int target) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList> list = new ArrayList >>();
Set set = new HashSet>();
Arrays.sort(num);
for(int i=0;i for(int j=i+1;j int k=j+1,l=num.length-1;
while(k if(num[i]+num[j]+num[k]+num[l]==target){
ArrayList result = new ArrayList();
result.add(num[i]);
result.add(num[j]);
result.add(num[k]);
result.add(num[l]);
set.add(result);
k++;
l--;
while(k while(l>k&&l==l+1) l--;
}else if(num[i]+num[j]+num[k]+num[l]>target){
l--;
}else{
k++;
}
}
}
}
list.addAll(set);
return list;
}
}
z****e
发帖数: 54598
6
java要弄清楚hashtable和hashmap的区别
这是基础题,leetcode显然是用hashmap合适
hashset会自动删除重复数据,不需要你去check
直接压进去就行了
g**4
发帖数: 863
7
我的大小都能过,就是按照3sum写的

【在 c********p 的大作中提到】
: 过不去了,我写的就是这个。。。
: 你去试试你以前写的版本,看能不能过。。。
: 我试了2个版本,加上我新写的,都过不去了。。。

c********p
发帖数: 1969
8
你发来看看嘛。

【在 g**4 的大作中提到】
: 我的大小都能过,就是按照3sum写的
c********p
发帖数: 1969
9
这个是以前写的。。这个当时是可以过大oj的。
和我这次写的,意思是一样的。。。
我就是按照以前能过的写的。。。结果都过不了了
import java.util.*;
public class Solution {
public ArrayList> fourSum(int[] num, int target) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList> result = new ArrayList Integer>>();
HashSet> set = new HashSet>();

if(num == null || num.length < 4){
return result;
}
Arrays.sort(num);
Hashtable> tab = new Hashtable ArrayList>();
int len = num.length * (num.length - 1) / 2;
int[] sumTwo = new int[len];
int id = 0;
for(int i = 0; i < num.length; i++){
for(int j = i + 1; j < num.length; j++){
int sum = num[i] + num[j];
sumTwo[id] = sum;
id++;
int[] arr = new int[2];
arr[0] = i;
arr[1] = j;
if(tab.containsKey(sum)){
ArrayList temp = tab.get(sum);
temp.add(arr);
}else{
ArrayList temp = new ArrayList();
temp.add(arr);
tab.put(sum, temp);
}
}
}

Arrays.sort(sumTwo);
for(int i = 0; i < sumTwo.length; i++){
int remind = target - sumTwo[i];
if(tab.containsKey(remind)){
ArrayList firstTwo = tab.get(sumTwo[i]);
ArrayList lastTwo = tab.get(remind);

for(int k = 0; k < firstTwo.size(); k++){
for(int l = 0; l < lastTwo.size(); l++){
int[] fTwo = firstTwo.get(k);
int[] lTwo = lastTwo.get(l);
if(fTwo[0] != lTwo[0] && fTwo[0] != lTwo[1] && fTwo[1
] != lTwo[0] && fTwo[1] != lTwo[1]){
ArrayList comb = new ArrayList();
comb.add(num[fTwo[0]);
comb.add(num[fTwo[1]);
comb.add(num[lTwo[0]);
comb.add(num[lTwo[1]);
Collections.sort(comb);
set.add(comb);
}
}
}
}
}
if(!set.isEmpty()){
return new ArrayList>(set);
}
return result;
}
}

Integer

【在 z****e 的大作中提到】
: leetcode 不超过两秒就可以过大oj
: 我用了800毫秒,还有1200毫秒富余
: 把你的code贴上来看看
: Run Status: Accepted!
: Program Runtime: 864 milli secs
: public class Solution {
: public ArrayList> fourSum(int[] num, int target) {
: // Start typing your Java solution below
: // DO NOT write main() function
: ArrayList> list = new ArrayList
c********p
发帖数: 1969
10
去试试你的,我用你的也过不了。。。
难道是我的问题?
rp不行?

【在 z****e 的大作中提到】
: java要弄清楚hashtable和hashmap的区别
: 这是基础题,leetcode显然是用hashmap合适
: hashset会自动删除重复数据,不需要你去check
: 直接压进去就行了

相关主题
LC 4-sum相当麻烦啊combination sum II
求高手解答cs 面试题?java 求助
leetcode的3sum的运行时间问题请问如何去除结果里面的重复
进入JobHunting版参与讨论
z****e
发帖数: 54598
11
那就多刷几次
应该是jvm在你测试的过程中启动了一下gc
导致时间超时
leetcode现在刷的人太多了
内存不够用了

【在 c********p 的大作中提到】
: 去试试你的,我用你的也过不了。。。
: 难道是我的问题?
: rp不行?

c********p
发帖数: 1969
12
你的,我刷了3次,就一次过了。。。。囧。。。
另外你程序里有个地方写错了,但不影响结果。因为用了hashset。
while后边的 k == k+1, 这个不对吧。。。还有下边那个l == l+1

【在 z****e 的大作中提到】
: 那就多刷几次
: 应该是jvm在你测试的过程中启动了一下gc
: 导致时间超时
: leetcode现在刷的人太多了
: 内存不够用了

c********p
发帖数: 1969
13
我发错版本了。。。
c********p
发帖数: 1969
14
这个是今天的。。。
import java.util.*;
public class Solution {
public ArrayList> fourSum(int[] num, int target) {
// Start typing your Java solution below
// DO NOT write main() function
HashSet> set = new HashSet>();

if(num == null || num.length <= 3){
return new ArrayList>(set);
}

Arrays.sort(num);
Hashtable> hash = new Hashtable ArrayList>();
int twoSumPair = num.length * (num.length - 1)/2;
int[] two = new int[twoSumPair];
int id = 0;
for(int i = 0; i < num.length; i++){
for(int j = i + 1; j < num.length; j++){
int sum = num[i] + num[j];
int[] arr = {i,j};
two[id] = sum;
id++;
if(hash.containsKey(sum)){
ArrayList list = hash.get(sum);
list.add(arr);
hash.put(sum, list);
}else{
ArrayList list = new ArrayList();
list.add(arr);
hash.put(sum, list);
}
}
}

Arrays.sort(two);
for(int i = 0; i < two.length; i++){
System.out.print( " " + two[i] + " ");
}
for(int i = 0; i < two.length; i++){
if(i != 0 && two[i] == two[i - 1]){
continue;
}
int left = target - two[i];
// System.out.println
if(hash.containsKey(left)){
ArrayList firstTwo = hash.get(two[i]);
ArrayList lastTwo = hash.get(left);
for(int m = 0; m < firstTwo.size(); m++){
for(int n = 0; n < lastTwo.size(); n++){
int[] array = new int[4];
int a = firstTwo.get(m)[0];
int b = firstTwo.get(m)[1];
int c = lastTwo.get(n)[0];
int d = lastTwo.get(n)[1];
// System.out.println("a " + a + "b " + b + "c" + c + "d"
+ d);
if(a == c || a == d || b == c || b == d){
continue;
}
array[0] = num[a];
array[1] = num[b];
array[2] = num[c];
array[3] = num[d];
Arrays.sort(array);
ArrayList four = new ArrayList();
for(int ct = 0; ct < 4; ct++){
four.add(array[ct]);
}
set.add(four);
}
}
hash.remove(left);
}
hash.remove(two[i]);
}
return new ArrayList>(set);
}
}

【在 z****e 的大作中提到】
: 那就多刷几次
: 应该是jvm在你测试的过程中启动了一下gc
: 导致时间超时
: leetcode现在刷的人太多了
: 内存不够用了

z****e
发帖数: 54598
15
那两行删掉就是了,之前写3sum时候留下的

【在 c********p 的大作中提到】
: 你的,我刷了3次,就一次过了。。。。囧。。。
: 另外你程序里有个地方写错了,但不影响结果。因为用了hashset。
: while后边的 k == k+1, 这个不对吧。。。还有下边那个l == l+1

z****e
发帖数: 54598
16
怎么还有system.out.
那两行如果你想写上去的话,那就是,会快一点点
while(k while(l>k&&num[l]==num[l+1]) l--;

【在 c********p 的大作中提到】
: 这个是今天的。。。
: import java.util.*;
: public class Solution {
: public ArrayList> fourSum(int[] num, int target) {
: // Start typing your Java solution below
: // DO NOT write main() function
: HashSet> set = new HashSet>();
:
: if(num == null || num.length <= 3){
: return new ArrayList>(set);

g**4
发帖数: 863
17
196ms,C++果然是快啊
class Solution {
public:
vector > fourSum(vector &num, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector > result;
if (num.size() < 4) {
return result;
}
sort(num.begin(),num.end());
for (int j=0;j int a = num[j];
// 3sum
for (int i=j+1;i int b = num[i];
int left = i+1;
int right = num.size() - 1;
// 2sum
while (left < right) {
int c = num[left];
int d = num[right];
int sum = a + b + c + d;
if (sum == target) {
vector t = {a,b,c,d};
if (find(result.begin(), result.end(), t) == result.
end()) {
result.push_back(t);
}
right--;
left++;
}else if (sum < target) {
left++;
}else {
right--;
}
}
}

}
}
};

【在 c********p 的大作中提到】
: 你发来看看嘛。
c********p
发帖数: 1969
18
哦,那个是我测试用的。。。。

【在 z****e 的大作中提到】
: 怎么还有system.out.
: 那两行如果你想写上去的话,那就是,会快一点点
: while(k: while(l>k&&num[l]==num[l+1]) l--;

c********p
发帖数: 1969
19
哭了,c++可以飘过了。
我用java写。经常把c++代码直接翻译过来发现过不了大oj。

【在 g**4 的大作中提到】
: 196ms,C++果然是快啊
: class Solution {
: public:
: vector > fourSum(vector &num, int target) {
: // Start typing your C/C++ solution below
: // DO NOT write int main() function
: vector > result;
: if (num.size() < 4) {
: return result;
: }

z****e
发帖数: 54598
20
java就是把简单的变复杂,把复杂的变简单
写hello world的话,java是最麻烦的

【在 c********p 的大作中提到】
: 哭了,c++可以飘过了。
: 我用java写。经常把c++代码直接翻译过来发现过不了大oj。

相关主题
一道面试题和解法(求指点).一道面试题
请教一下subset I 输出子集顺序问题permutationII ,如果不用hashset,用迭代的方法,如何防止重复
如何避免permutation中的重复计数HashTable space complexity?
进入JobHunting版参与讨论
c********p
发帖数: 1969
21
快看看我的复杂度是多少。。。
是o(n(^2)么?

【在 z****e 的大作中提到】
: java就是把简单的变复杂,把复杂的变简单
: 写hello world的话,java是最麻烦的

z****e
发帖数: 54598
22
不止吧,我依稀看到了三重循环在里面

【在 c********p 的大作中提到】
: 快看看我的复杂度是多少。。。
: 是o(n(^2)么?

c********p
发帖数: 1969
23
是哦,同样是3层,还是你的方法简洁。。。

【在 z****e 的大作中提到】
: 不止吧,我依稀看到了三重循环在里面
l*******0
发帖数: 63
24
A solution that could deal with dups. O(N^3).
public ArrayList> fourSum(int[] num, int target) {
int len=num.length;
Arrays.sort(num);
ArrayList> results=new ArrayList Integer>>();
for(int i=0;i if(i-1>=0&&num[i]==num[i-1]) continue; //skip dup in outmost
loop
for(int j=i+1;j if(j-1>=i+1&&num[j]==num[j-1]) continue; //skip dup in 2nd
outmost loop

int left=j+1;
int right=len-1;

while(left int sum=num[i]+num[j]+num[left]+num[right];
if(sum==target){
ArrayList list=new ArrayList();
list.add(num[i]);
list.add(num[j]);
list.add(num[left]);
list.add(num[right]);
results.add(list);

left++;
right--;
while(left left-1]) left++; //skip dup
while(left right]) right--; //skip dup
}else if(sum left++;
}else{
right--;
}

}
}
}
return results;
}
f****p
发帖数: 18483
25
笨死!你还是进尼姑庵吧~

【在 c********p 的大作中提到】
: 过不去了,我写的就是这个。。。
: 你去试试你以前写的版本,看能不能过。。。
: 我试了2个版本,加上我新写的,都过不去了。。。

c********p
发帖数: 1969
26
哦哦。。。
今天leetcode大oj就是很难过。

【在 l*******0 的大作中提到】
: A solution that could deal with dups. O(N^3).
: public ArrayList> fourSum(int[] num, int target) {
: int len=num.length;
: Arrays.sort(num);
: ArrayList> results=new ArrayList: Integer>>();
: for(int i=0;i: if(i-1>=0&&num[i]==num[i-1]) continue; //skip dup in outmost
: loop
: for(int j=i+1;j
c********p
发帖数: 1969
27
就你聪明!

【在 f****p 的大作中提到】
: 笨死!你还是进尼姑庵吧~
u*****o
发帖数: 1224
28
这题没做过,只好飘过。。甜甜加油!

【在 c********p 的大作中提到】
: 快看看我的复杂度是多少。。。
: 是o(n(^2)么?

u*****o
发帖数: 1224
29
他逗你呢啊。。你就笑笑呗。。。

【在 c********p 的大作中提到】
: 就你聪明!
c********p
发帖数: 1969
30
哈哈我知道,他追着我的帖子跑。。
嘻嘻你id是说你是超级大波妹?
哈哈哈。。。

【在 u*****o 的大作中提到】
: 他逗你呢啊。。你就笑笑呗。。。
相关主题
问个Java的HashSet.contains的问题4sum o(n^2)超时
Linked电面分享,挺好的题 应该已挂3sum on LeetCode OJ
LeetCode 的 4 sum 问题 如何用hash table做呢?leetcode上遇到的问题
进入JobHunting版参与讨论
u*****o
发帖数: 1224
31
囧了。。是超声波的意思啊。。被你一说伦家都不好意思了。。

【在 c********p 的大作中提到】
: 哈哈我知道,他追着我的帖子跑。。
: 嘻嘻你id是说你是超级大波妹?
: 哈哈哈。。。

c********p
发帖数: 1969
32
哦哦。
你搞电磁的还是物理的。
我孤陋寡闻了。

【在 u*****o 的大作中提到】
: 囧了。。是超声波的意思啊。。被你一说伦家都不好意思了。。
c********p
发帖数: 1969
33
哦哦。
你搞电磁的还是物理的。
我孤陋寡闻了。

【在 u*****o 的大作中提到】
: 囧了。。是超声波的意思啊。。被你一说伦家都不好意思了。。
t*******e
发帖数: 274
34
为什么要有这两句呢?既然用了hashset应该不用去重复了吧?

【在 z****e 的大作中提到】
: 怎么还有system.out.
: 那两行如果你想写上去的话,那就是,会快一点点
: while(k: while(l>k&&num[l]==num[l+1]) l--;

1 (共1页)
进入JobHunting版参与讨论
相关主题
permutationII ,如果不用hashset,用迭代的方法,如何防止重复leetcode 4sum N^3解法有时Time Limit Exceeded有时又能通过
HashTable space complexity?LC 4-sum相当麻烦啊
问个Java的HashSet.contains的问题求高手解答cs 面试题?
Linked电面分享,挺好的题 应该已挂leetcode的3sum的运行时间问题
LeetCode 的 4 sum 问题 如何用hash table做呢?combination sum II
4sum o(n^2)超时java 求助
3sum on LeetCode OJ请问如何去除结果里面的重复
leetcode上遇到的问题一道面试题和解法(求指点).
相关话题的讨论汇总
话题: arraylist话题: int话题: num话题: integer话题: sum