js排列組合算法解決方案

之前文章中談過排列組合算法,主要事遞歸,代碼如下

const arrangeCombination = arr => {
    const res = [], len = arr.length, inner = ary => {
        for (let i = 0; i < len; i++) {
            let notHas = !ary.includes(arr[i]), tmp = [...ary, arr[i]];
            if (ary.length === len - 1) {
                notHas && res.push(tmp)
                continue
            }
            notHas && inner(tmp);
        }
    }
    inner([]);
    return res;
}

例如輸入[1,2,3],

輸出:[[ 1, 2, 3 ],[ 1, 3, 2 ],[ 2, 1, 3 ],[ 2, 3, 1 ],[ 3, 1, 2 ],[ 3, 2, 1 ]]。

不過只能解決無重複數的排序問題。

這幾天稍作研究,嘗試解決出了無重複數的排序,下面直接上代碼

const arrangeCombinationRepeat = arr => {
    const res = [], len = arr.length,
        //保證兩個數組中所有數所出現次數一致
        arrCompare = (a, b) => {
            const c = arr => arr.reduce((pre, cur) => (pre[cur] ? pre[cur]++ : (pre[cur] = 1), pre), {}), oa = c(a),
                ob = c(b)
            for (let i in oa) {
                if (oa[i] !== ob[i]) {
                    return false
                }
            }
            return true
        },
        inner = ary => {
            for (let i = 0; i < len; i++) {
                let tmp = [...ary, arr[i]];
                if (ary.length === len - 1) {
                    arrCompare(arr, tmp) && res.every(arr => JSON.stringify(arr) !== JSON.stringify(tmp)) && res.push(tmp);
                    continue
                }
                inner(tmp);
            }
        };
    inner([]);
    return res;
}

驗證輸入:[1,1,3]

輸出:[ [ 1, 1, 3 ], [ 1, 3, 1 ], [ 3, 1, 1 ] ]。

輸入:[1,1,2,1,2]

輸出:[
  [ 1, 1, 1, 2, 2 ],
  [ 1, 1, 2, 1, 2 ],
  [ 1, 1, 2, 2, 1 ],
  [ 1, 2, 1, 1, 2 ],
  [ 1, 2, 1, 2, 1 ],
  [ 1, 2, 2, 1, 1 ],
  [ 2, 1, 1, 1, 2 ],
  [ 2, 1, 1, 2, 1 ],
  [ 2, 1, 2, 1, 1 ],
  [ 2, 2, 1, 1, 1 ]
]。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章