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和1234spa
這裏給同窗提個醒。。再往下直接就是我寫得解題思路了,但願你們能夠先本身思考一下這個問題。code
利用二叉樹。blog
當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的時候的解決思路input
也就是說,n=5
時候的輸出,是由n=4
的輸出和'5'
, ',5'
進行組合後的來的。it
說到這這個題就很容易解決了,利用二叉樹的層次遍歷,每一層遍歷的時候都基於上一層的遍歷結果生成答案。io
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('和') }
輸出測試:function
這個算法的時間空間複雜度均爲O(二叉樹的節點數),也就是O(2^n)
那麼這個算法題就到這了,若是你們又什麼好的想法或者個人有什麼問題,歡迎在討論區和我交流