由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 一FG家常见题
相关主题
3sum on LeetCode OJfind sum of three number in array
请教一道L的题问求array中3个数和最接近k的解法
CS algorithm question请问如何去除结果里面的重复
LC的3sum谁有简洁代码?Given an array of N integers from range [0, N] and one is missing. Find the missing number.
find Kth Largest Element 有没有更简化的解法[a9面经] print x,y,z
G onsite面经问个G的题目
一道google 经典题以前能过的leetcode 3sum, 现在fail了, 求助(时间超出了)
leetcode上的3sumarray contains two integer that sum up to 7
相关话题的讨论汇总
话题: int话题: set话题: solution话题: array话题: triplets
进入JobHunting版参与讨论
1 (共1页)
p****n
发帖数: 148
1
3Sum,原题附在下面
有什么好办法( O(n^2 ) ?)能处理输入中重复的元素,又不产生重复解吗?
如 S = {0, 0, 0, 0, -1, -1, -1, -1, 2},
A solution set is:
(0, 0, 0)
(-1,-1,2)
========
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)
S*******w
发帖数: 24236
2
check当前获得的三元组和前一个
如果一样 就不添加到result里面
不一样就添加。

a

【在 p****n 的大作中提到】
: 3Sum,原题附在下面
: 有什么好办法( O(n^2 ) ?)能处理输入中重复的元素,又不产生重复解吗?
: 如 S = {0, 0, 0, 0, -1, -1, -1, -1, 2},
: A solution set is:
: (0, 0, 0)
: (-1,-1,2)
: ========
: 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.

s******n
发帖数: 3946
3
保证i void printSum3(int* a, int length, int sum) {
hashtable t = new hashtable();
for (int i=0; i t.put(a[i], i);
}
for (int i=0; i for (int j=i+1; j int k = t.find( sum - a[i] - a[j]);
if (k>j) printf("%d %d %d\n", i, j, k);
}
}
p****n
发帖数: 148
4
i,j,k元素在数组中的位置吧
若是这样无法在有重复元素的情况下保证不出现重复解吧

【在 s******n 的大作中提到】
: 保证i: void printSum3(int* a, int length, int sum) {
: hashtable t = new hashtable();
: for (int i=0; i: t.put(a[i], i);
: }
: for (int i=0; i: for (int j=i+1; j: int k = t.find( sum - a[i] - a[j]);
: if (k>j) printf("%d %d %d\n", i, j, k);

d*****i
发帖数: 122
5


【在 p****n 的大作中提到】
: i,j,k元素在数组中的位置吧
: 若是这样无法在有重复元素的情况下保证不出现重复解吧

i*********7
发帖数: 348
6
先sort,然后用vertor存解,然后再将此vector存进set里。set的键值有唯一性,所以
会刷掉重复的
y**********u
发帖数: 6366
7
我觉得set很不decent,有什么办法不用set吗?

【在 i*********7 的大作中提到】
: 先sort,然后用vertor存解,然后再将此vector存进set里。set的键值有唯一性,所以
: 会刷掉重复的

p****n
发帖数: 148
8
“存进set里”的复杂度有多大?算上这个以后的总复杂度是多大?

【在 i*********7 的大作中提到】
: 先sort,然后用vertor存解,然后再将此vector存进set里。set的键值有唯一性,所以
: 会刷掉重复的

S*******w
发帖数: 24236
9
我的solution work吗

【在 p****n 的大作中提到】
: i,j,k元素在数组中的位置吧
: 若是这样无法在有重复元素的情况下保证不出现重复解吧

G******e
发帖数: 229
10
You are right, then the complexity would be O(n*nlogn) instead of O(n*n). If
the set is implemented as balanced BST. If unordered_set is used, then only
average case complexity is guaranteed.

【在 p****n 的大作中提到】
: “存进set里”的复杂度有多大?算上这个以后的总复杂度是多大?
相关主题
G onsite面经find sum of three number in array
一道google 经典题问求array中3个数和最接近k的解法
leetcode上的3sum请问如何去除结果里面的重复
进入JobHunting版参与讨论
q***y
发帖数: 236
11
这样是可以的。先对数组排序,查找就是按顺序的。

【在 S*******w 的大作中提到】
: check当前获得的三元组和前一个
: 如果一样 就不添加到result里面
: 不一样就添加。
:
: a

y**********u
发帖数: 6366
12
相当大
所以应该这么做,其实最小数的循环避开重复的
然后次小数递增的时候在本循环内避开重复的就ok了

所以

【在 p****n 的大作中提到】
: “存进set里”的复杂度有多大?算上这个以后的总复杂度是多大?
y**********u
发帖数: 6366
13
不行
比如(-1, -1, -1, 0, 0, 1, 2)
从第一个-1开始可以得到
(-1, -1, 2)
(-1, 0, 1)
(-1, 1, 2)
但是从第二个-1开始第二组循环的时候
还会碰到(-1, -1, 2)

that
of

【在 S*******w 的大作中提到】
: check当前获得的三元组和前一个
: 如果一样 就不添加到result里面
: 不一样就添加。
:
: a

c**m
发帖数: 535
14
第二个循环从0开始就好了,跳过与前一次循环相同的数

【在 y**********u 的大作中提到】
: 不行
: 比如(-1, -1, -1, 0, 0, 1, 2)
: 从第一个-1开始可以得到
: (-1, -1, 2)
: (-1, 0, 1)
: (-1, 1, 2)
: 但是从第二个-1开始第二组循环的时候
: 还会碰到(-1, -1, 2)
:
: that

i*********7
发帖数: 348
15
其实如果你愿意自己重载hash_map的hash函数和comparator函数的话,倒也是可以不用
set的。
用hash,bool>这个容器类来保证的话,就可以做到o(n^2)。
第一遍用o(n^2)将所有pair存起来,pair的值要顺序存放,这样就不可能会出现重复。
第二遍再用o(n)逐个扫。
i*********7
发帖数: 348
16
另外还有一个空间复杂度没那么高的做法。你记录一下你前一个扫的值。(当然,这需
要在一个排好序的数组里完成)
在外部循环往下扫的时候,如果遇到与你之前刚扫的值相同则跳过。
举个例子。
(-1, -1, -1, 0, 0, 1, 2)
因为你扫了-1,那么记录一下prev = -1。当你扫到下一个-1,你就发现cur = prev.那
你就直接跳过当前的内部循环往下扫到第一个不是-1的数为止,也就是0。
s********0
发帖数: 34
17
思路: 先排序,然后枚举i,取p void three_sum(int *a, int n, int k){
sort(a, a+n);
for(int i = 0; i < n; i++){
int t = k-a[i];
int p = i+1, q = n-1;
while(p < q){
if(a[p] + a[q] == t){
cout< while(p < q && a[p] == a[p+1]) p++;
p++;// start from next
}
else if(a[p] + a[q] < t) p++;
else q--;
}
while(i+1 < n && a[i] == a[i+1]) i++;
}
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
array contains two integer that sum up to 7find Kth Largest Element 有没有更简化的解法
关于结果除掉重复的问题请教G onsite面经
请教一道题目一道google 经典题
一个小公司面经leetcode上的3sum
3sum on LeetCode OJfind sum of three number in array
请教一道L的题问求array中3个数和最接近k的解法
CS algorithm question请问如何去除结果里面的重复
LC的3sum谁有简洁代码?Given an array of N integers from range [0, N] and one is missing. Find the missing number.
相关话题的讨论汇总
话题: int话题: set话题: solution话题: array话题: triplets