题目
input: n
output: 1...n中的数字可以分割出来的连续数字串的所有组合,不同组合之间用一个'和'连接
示例:
input: 3
output: 1,2,3和1,23和12,3和123
input: 4
output: 1,2,3,4和12,3,4和1,23,4和1,2,34和12,34和123,4和1,234和1234
这里给同学提个醒。。再往下直接就是我写得解题思路了,希望大家可以先自己思考一下这个问题。
解题思路
利用二叉树。
当input = 1
时,output = 1
当input = 2
时,output = 1,2和12
,其实我们可以看做output = ('1' + ',2') + '和' + ('1' + '2')
当input = 3
时,output = 1,2,3和12,3和1,23和123
,其实我们可以看做output = ('1,2' + ',3') + '和' + ('12' + ',3') + 和 + ....
下面用一个图来说明n为5的时候的解决思路
也就是说,n=5
时候的输出,是由n=4
的输出和'5'
, ',5'
进行组合后的来的。
说到这这个题就很容易解决了,利用二叉树的层次遍历,每一层遍历的时候都基于上一层的遍历结果生成答案。
代码
function solution (n) {
let result = ['1'] // 存放当前遍历层次的结果
for (let i = 2; i <= n; i++) { // i 为当前遍历到的层数
for (let j = Math.pow(2, i - 2); j >= 1; j--) { // j 为上一层共有结点数}
let temp = result.shift() // 取出一个结果
result.push(`${temp},${i}`) // 放进 temp + ,i
result.push(`${temp}${i}`) // 放进 temp + i
}
}
return result.join('和')
}
输出测试:
这个算法的时间空间复杂度均为O(二叉树的节点数),也就是O(2^n)
那么这个算法题就到这了,如果大家又什么好的想法或者我的有什么问题,欢迎在讨论区和我交流
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。