我试图解决以下问题:
给定两个整数n和k,返回k的所有可能组合 数字超出1 ... n。
我在ruby中执行此操作并尝试实施此解决方案https://gist.github.com/safeng/8156755,但我的结果始终是为空。
def combine(n, k)
res = [[]]
return res if k > n || n == 0
sol = []
comb(0, 0, k, n, sol, res)
res
end
def comb(start, idx, k, n, sol, res)
if idx == k
res << sol
else
(start..n).to_a.each do |i|
sol << (i + 1)
comb(i + 1, idx + 1, k, n, sol, res)
sol.pop
end
end
end
print combine(4, 2) #[[], [], [], [], [], [], [], [], [], [], []]
你有什么想法吗?
谢谢
注意(更新):
有效的代码:
def combine(n, k)
res = []
return res if k > n || n == 0
sol = []
comb(0, 0, k, n, sol, res)
res
end
def comb(start, idx, k, n, sol, res)
if idx == k
res << sol.dup
else
(start..n - 1).to_a.each do |i|
sol << (i + 1)
comb(i + 1, idx + 1, k, n, sol, res)
sol.pop
end
end
end
答案 0 :(得分:2)
您的代码中存在一些错误:
在combine
初始化数组时,您不需要为res添加空数组:
res = []
当您将sol
添加到res
时,您应该复制它而不是推送引用,否则当您修改{res
时,已添加到sol
的解决方案将被修改1}}:
if idx == k
res << sol.dup
最后,您只需要循环到n-1
(因为您将i + 1
推送到sol
):
(start..n-1).to_a.each do |i|