由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问个snapchat的面经题dfs优化的题
相关主题
那个24 game given 4 number用= - × /的题请教MapReduce怎么找median
问个snapchat的面经题G电面面经
问个snapchat的面经题 二分检索的if "(i > cur &&nums[i] == nums[i-1]) continue;
问个snapchat的面经题 交朋友问道面试题
这两道leetcode题有更好的答案吗?面了几家电面,发现Backtracking考到的概率真高
A Question from leetcode, 求标准解法,本人解的太笨袅对自己DFS能力彻底的绝望了。
问一个题面试题总结(2) - Two/Three pointers
最后一道snapchat面经题,顺求bless经典递归题需要搞懂非递归算法吗?
相关话题的讨论汇总
话题: ele话题: dp话题: maps话题: rep1话题: dfs
进入JobHunting版参与讨论
1 (共1页)
s*******m
发帖数: 228
1
给你一个数组,2,3,7,一个target 5,怎么找到所有的组合的数量?
2+3, 3+2 两个,所以return 2
开始想到了hashmap,走了弯路,发现不对转回到dfs
写完之后followup:
怎么优化这个dfs?提示:说这个是一个tree的结构的话你会发现里面有好多重复的
branch,应该怎么处理?
-----------
排序后,没看出来有重复的branch
g****o
发帖数: 547
2
我觉得应该先排序
2 3 7
你不该是从2开始dfs找到2 3
然后3开始dfs找到3 2,这样重复了
而是dfs每次只能往后面的数找,这样找到2 3你算出有2 3,3 2两种情况
另外也可以dp
dp[target][n]代表用前n个数加出target的可能数
dp[target][n]=dp[target][n-1]+dp[target-a[n]][n-1]
s*******m
发帖数: 228
3
那要对每个结果,都做个permutation.
可行。
排序后,dfs找到一个结果就直接剪枝了。
似乎不用优化了吧

【在 g****o 的大作中提到】
: 我觉得应该先排序
: 2 3 7
: 你不该是从2开始dfs找到2 3
: 然后3开始dfs找到3 2,这样重复了
: 而是dfs每次只能往后面的数找,这样找到2 3你算出有2 3,3 2两种情况
: 另外也可以dp
: dp[target][n]代表用前n个数加出target的可能数
: dp[target][n]=dp[target][n-1]+dp[target-a[n]][n-1]

F****n
发帖数: 3271
4
除非本来就是排好序的或有空间要求
否则排序至少O(nlogn), 用hastable O(n)

【在 s*******m 的大作中提到】
: 给你一个数组,2,3,7,一个target 5,怎么找到所有的组合的数量?
: 2+3, 3+2 两个,所以return 2
: 开始想到了hashmap,走了弯路,发现不对转回到dfs
: 写完之后followup:
: 怎么优化这个dfs?提示:说这个是一个tree的结构的话你会发现里面有好多重复的
: branch,应该怎么处理?
: -----------
: 排序后,没看出来有重复的branch

n******n
发帖数: 12088
5
hash是捷径,怎么弯路了?

【在 s*******m 的大作中提到】
: 给你一个数组,2,3,7,一个target 5,怎么找到所有的组合的数量?
: 2+3, 3+2 两个,所以return 2
: 开始想到了hashmap,走了弯路,发现不对转回到dfs
: 写完之后followup:
: 怎么优化这个dfs?提示:说这个是一个tree的结构的话你会发现里面有好多重复的
: branch,应该怎么处理?
: -----------
: 排序后,没看出来有重复的branch

n******n
发帖数: 12088
6
DFS才是错误的

【在 s*******m 的大作中提到】
: 给你一个数组,2,3,7,一个target 5,怎么找到所有的组合的数量?
: 2+3, 3+2 两个,所以return 2
: 开始想到了hashmap,走了弯路,发现不对转回到dfs
: 写完之后followup:
: 怎么优化这个dfs?提示:说这个是一个tree的结构的话你会发现里面有好多重复的
: branch,应该怎么处理?
: -----------
: 排序后,没看出来有重复的branch

s*******m
发帖数: 228
7
求解释,
那是别人的面经。

【在 n******n 的大作中提到】
: DFS才是错误的
r****7
发帖数: 2282
8
排序不排序没有影响
如果没有重复元素就没有重复branch,有重复元素就有

【在 s*******m 的大作中提到】
: 给你一个数组,2,3,7,一个target 5,怎么找到所有的组合的数量?
: 2+3, 3+2 两个,所以return 2
: 开始想到了hashmap,走了弯路,发现不对转回到dfs
: 写完之后followup:
: 怎么优化这个dfs?提示:说这个是一个tree的结构的话你会发现里面有好多重复的
: branch,应该怎么处理?
: -----------
: 排序后,没看出来有重复的branch

C****t
发帖数: 53
9
一个hashtable就好, key为元素,value为两个数【重复次数,visited的状态】
def total(nums, tar):
maps = {}
res = 0
for ele in nums:
if ele not in maps:
maps[ele] = [1,0]
else:
maps[ele][0] += 1
for ele in nums:
if maps[ele][1] = 1: continue
diff = tar - ele
if diff not in maps: continue
rep1, rep2 = maps[ele][0], maps[diff][0]
if ele == diff and rep1 > 1:
res += rep1*(rep1-1)//2
elif ele != diff:
res += rep1*rep2
maps[ele][1] = 1
maps[diff][1] = 1
return res
r****7
发帖数: 2282
10
搞笑吧,你当成2sum了?

【在 C****t 的大作中提到】
: 一个hashtable就好, key为元素,value为两个数【重复次数,visited的状态】
: def total(nums, tar):
: maps = {}
: res = 0
: for ele in nums:
: if ele not in maps:
: maps[ele] = [1,0]
: else:
: maps[ele][0] += 1
: for ele in nums:

相关主题
A Question from leetcode, 求标准解法,本人解的太笨袅请教MapReduce怎么找median
问一个题G电面面经
最后一道snapchat面经题,顺求blessif "(i > cur &&nums[i] == nums[i-1]) continue;
进入JobHunting版参与讨论
n******n
发帖数: 12088
11
2sum变种啊。

【在 r****7 的大作中提到】
: 搞笑吧,你当成2sum了?
s*******m
发帖数: 228
12
不是two sum.
是leetcode的combination sum.
只不过,一个的解的排列,也都是解

【在 n******n 的大作中提到】
: 2sum变种啊。
n******n
发帖数: 12088
13
就是说不止两个数?你给的例子误导。
那就排序再递归喽。

【在 s*******m 的大作中提到】
: 不是two sum.
: 是leetcode的combination sum.
: 只不过,一个的解的排列,也都是解

a*********0
发帖数: 2727
14
dp得全是正数吧,负数怎么整?

【在 g****o 的大作中提到】
: 我觉得应该先排序
: 2 3 7
: 你不该是从2开始dfs找到2 3
: 然后3开始dfs找到3 2,这样重复了
: 而是dfs每次只能往后面的数找,这样找到2 3你算出有2 3,3 2两种情况
: 另外也可以dp
: dp[target][n]代表用前n个数加出target的可能数
: dp[target][n]=dp[target][n-1]+dp[target-a[n]][n-1]

s*******m
发帖数: 228
15
面经中没讲,应该没有负数。
有的话
dfs还好使不?

【在 a*********0 的大作中提到】
: dp得全是正数吧,负数怎么整?
s*******m
发帖数: 228
16
对啊,只求个数,dp就可以了吧。

【在 a*********0 的大作中提到】
: dp得全是正数吧,负数怎么整?
k****r
发帖数: 807
17
use DP
int CountWays(vector A, int target) {
vector dp(target + 1, 0);
dp[0] = 1;
for (int i = 0; i <= target; ++i) {
for (auto a : A) {
if (i >= a) {
dp[i] += dp[i - a];
}
}
}
return dp[k];
}

【在 s*******m 的大作中提到】
: 给你一个数组,2,3,7,一个target 5,怎么找到所有的组合的数量?
: 2+3, 3+2 两个,所以return 2
: 开始想到了hashmap,走了弯路,发现不对转回到dfs
: 写完之后followup:
: 怎么优化这个dfs?提示:说这个是一个tree的结构的话你会发现里面有好多重复的
: branch,应该怎么处理?
: -----------
: 排序后,没看出来有重复的branch

s*******m
发帖数: 228
18
dp 怎么计算
2,3;;; 3,2 这样的情况呢

【在 g****o 的大作中提到】
: 我觉得应该先排序
: 2 3 7
: 你不该是从2开始dfs找到2 3
: 然后3开始dfs找到3 2,这样重复了
: 而是dfs每次只能往后面的数找,这样找到2 3你算出有2 3,3 2两种情况
: 另外也可以dp
: dp[target][n]代表用前n个数加出target的可能数
: dp[target][n]=dp[target][n-1]+dp[target-a[n]][n-1]

w*****d
发帖数: 105
19
先dp把unique的combination数得到。
对于每个combination,算permutation数。所有permutation的和就是你要的结果了。
算combination的算法大家都说了,我就不重复了。
算permutation的话,需要知道总个数n,和每个元素的重复个数,比如:1个a, 2个b
, 3个c,...,那么:
permutation = n! / (1! * 2! * 3! * ...)

【在 s*******m 的大作中提到】
: dp 怎么计算
: 2,3;;; 3,2 这样的情况呢

s*******m
发帖数: 228
20
不能用1维dp吧,
因为dp[i-a]的已经被覆盖掉了

【在 k****r 的大作中提到】
: use DP
: int CountWays(vector A, int target) {
: vector dp(target + 1, 0);
: dp[0] = 1;
: for (int i = 0; i <= target; ++i) {
: for (auto a : A) {
: if (i >= a) {
: dp[i] += dp[i - a];
: }
: }

H*******g
发帖数: 6997
21
弱问下,着算是TWO SUM的变形么?
俺今天才知道啥叫TWO SUM,哈哈

【在 s*******m 的大作中提到】
: 给你一个数组,2,3,7,一个target 5,怎么找到所有的组合的数量?
: 2+3, 3+2 两个,所以return 2
: 开始想到了hashmap,走了弯路,发现不对转回到dfs
: 写完之后followup:
: 怎么优化这个dfs?提示:说这个是一个tree的结构的话你会发现里面有好多重复的
: branch,应该怎么处理?
: -----------
: 排序后,没看出来有重复的branch

1 (共1页)
进入JobHunting版参与讨论
相关主题
经典递归题需要搞懂非递归算法吗?这两道leetcode题有更好的答案吗?
yelp一题,攒rpA Question from leetcode, 求标准解法,本人解的太笨袅
8 queens问题最好解法是什么?时间复杂度?问一个题
Facebook求bless最后一道snapchat面经题,顺求bless
那个24 game given 4 number用= - × /的题请教MapReduce怎么找median
问个snapchat的面经题G电面面经
问个snapchat的面经题 二分检索的if "(i > cur &&nums[i] == nums[i-1]) continue;
问个snapchat的面经题 交朋友问道面试题
相关话题的讨论汇总
话题: ele话题: dp话题: maps话题: rep1话题: dfs