算法之不按期更新(二)(2018-04-15)

題目

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)

那麼這個算法題就到這了,若是你們又什麼好的想法或者個人有什麼問題,歡迎在討論區和我交流

相關文章
相關標籤/搜索