需求:
输入一个数n和一个数组
返回一个长度最短、数组求和后等于n的第一个数组
例如:
输入:n = 8,needArr = [2, 3, 4, 5, 6]
输出:[ 3, 5 ]
思路:
封装一个函数,由于我们传入的数组参数needArr的每项元素为Number类型,所以需要将其转为String类型,方可进行排列组合。然后进行排列组合算法核心:每拿出一个数据源,让数据源与抽出的数组依次组合,循环往复(用递归实现)即可。之后定义数组接受排列组合后的值,通过map转为二维数组,筛选出求和后等于n的数组,按照数组长度进行排序,找到第一个,即为数组长度最短的数组,输出即可。
代码:
function findMinArr(n, needArr) {
dataArr = needArr.join(",").split(",")
// console.log(dataArr);
// 排列组合算法
function getGroup(dataArr, index = 0, group = []) {
let arr = new Array();
// 拿出a元素,添加至新数组
arr.push(dataArr[index]);
for (var i = 0; i < group.length; i++) {
arr.push(group[i] + dataArr[index]);
}
// 把arr数组的值push进第一个数组
group.push.apply(group, arr);
if (index + 1 >= dataArr.length) return group;
// 递归实现排列组合
else return getGroup(dataArr, index + 1, group);
}
// 定义数组接受排列组合后的值
let sucArr = getGroup(dataArr)
// 转二维数组
let twoArr = sucArr.map(item => {
return item.split("");
});
// console.log(twoArr);
// 筛选出等于n的数组
let o = twoArr.filter((item) => {
return item.reduce((prev, current) => {
return Number(prev) + Number(current)
}, 0).toString().split(",") == n
})
// console.log(o);
// 排序后选择最后一个
console.log(o.sort().findLast((item) => {
return item
}))
}
findMinArr(8, [2, 3, 4, 5, 6])