之前文章中談過排列組合算法,主要事遞歸,代碼如下
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 ]
]。