请教个算法题,从几组数组中每组取一个数字,组成新的数组,有多少种组合?

发布于 2022-09-11 14:44:55 字数 225 浏览 11 评论 0

比如有[1,2]和[1,3,4]两组数组,每组取一个数字,根据size,组成新的数组。
如size为2,则结果为[[1,1],[1,3],[1,4],[2,1],[2,3],[2,4],[3,1],[4,1],[2,1],[3,2],[4,2]];
如果size为3,则结果为[[1,1,3],[1,1,4],[1,3,4]...以此类推]
大概就是一个函数 fun(arr1,arr2,size)然后得到一个新的数组

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

染柒℉ 2022-09-18 14:44:55

把他们丢进一个set里,然后剩下的就是 n个不重复数字能组成多少个指定size的数组 问题了
也就是 (n-size+1)*(n-size)/2


额,仔细看了下,要分两步,第一步先拆分size,第二步再取数
取数还是可以套用上面的算法,拆分的算法也较好实现
大概步骤:
计算较短,较长数组长度,记为min,max
然后将min与size比较,取较小为临界值(flag)
剩下的就是从min长度数组里取flag个数,从max取size-flag个数
然后flag--
具体的逻辑判断还要更详细一点,大概思路就是这样了

浅黛梨妆こ 2022-09-18 14:44:55

python3

from itertools import product,\
                      combinations as comb

def flatten(itr):  
    for el in itr:  
        if hasattr(el, "__iter__") and not isinstance(el, (str, bytes)):  
            yield from flatten(el)
        else:  
            yield el
            

a = [1, 2]
b = [1, 3, 4]

print(list(product(a, b)))
#[(1, 1), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4)]

print([list(flatten(t))for t in product(a, comb(b, 2))])
#[[1, 1, 3], [1, 1, 4], [1, 3, 4], [2, 1, 3], [2, 1, 4], [2, 3, 4]]        
勿忘初心 2022-09-18 14:44:55
function combine(arr1, arr2, size){
    // 合并、排序、去重
    let arr = arr1.concat(arr2).sort((item1, item2) => {
        return item1 - item2;
    }).filter((item, index, arr) => {
        return arr.indexOf(item ,index+1) < 0;
    });

    let getCombine = function(arr,size){
        if(size <= 1){
            // 递归基本情形
            return arr.map(item =>{
                return [item];
            });
        }else{
            let smallCombine = getCombine(arr, size-1);
            let res = [];
            arr.forEach(item => {
                smallCombine.forEach( combineItem=> {
                    let newCombineItem = combineItem.concat();
                    newCombineItem.unshift(item);
                    res.push(newCombineItem);
                });
            });
            return res;
        }
    }
    return getCombine(arr, size);
}

console.log(combine([1,2], [1,3,4], 3));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文