Java 实现笛卡尔积计算

news/2024/6/18 21:41:50 标签: java, 后端, 算法

代码

java">    // 实现思路计算当前第N个List和前面N-1个List的笛卡尔积集合的笛卡尔积集合(动态规划)
    public static<T>  List<List<T>> cartesianProduct(List<List<T>> data){
        List<List<T>> res = null; // 结果集(当前为第N个List,则该处存放的就为前N-1个List的笛卡尔积集合)
        for (List<T> list: data){ // 遍历数据
            List<List<T>> temp = new ArrayList<>(); // 临时结果集,存放本次循环后生成的笛卡尔积集合
            if (res == null){ // 结果集为null表示第一次循环既list为第一个List
                for (T t: list){ // 便利第一个List
                    // 利用stream生成List,第一个List的笛卡尔积集合约等于自己本身(需要创建一个List并把对象添加到当中),存放到临时结果集
                    temp.add(Stream.of(t).collect(Collectors.toList()));
                }
                res = temp; // 将临时结果集赋值给结果集
                continue; // 跳过本次循环
            }
            // 不为第一个List,计算前面的集合(笛卡尔积)和当前List的笛卡尔积集合
            for (T t: list){ // 便利
                for (List<T> rl: res){ // 便利前面的笛卡尔积集合
                    // 利用stream生成List
                    temp.add(Stream.concat(rl.stream(), Stream.of(t)).collect(Collectors.toList()));
                }
            }
            res = temp; // 将临时结果集赋值给结果集
        }
        // 返回结果
        return res;
    }

http://www.niftyadmin.cn/n/860390.html

相关文章

Java double转bigDecimal时精度丢失问题

使用new BigDecimal(double val)对doubel进行转换会导致转换后精度丢失 原因 BigDecimal的构造函数public BigDecimal(double val)会损失了double 参数的精度。jdk中已经明确不建议使用new BigDecimal(double value)这种形式的构造函数&#xff0c;而是使用new BigDecimal(St…

集合栈计算机(详细解答)UVa12096

题目: 有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈&#xff0c;并且支持以下操作&#xff1a; PUSH&#xff1a;空集“{}”入栈 DUP&#xff1a;把当前栈顶元素复制一份后再入栈 UNION&#xff1a;出栈两个集合&#xff0c;然后把两者的并集入栈…

vue根据权限动态生成路由

vue根据权限动态生成路由 import store from /store // vuex import router from /router // router import axios from ./request // axios // 存放页面信息 const data [// { // 主菜单// path: /okkk, // 页面路径// name: okkk, // 名称// component: () > impo…

团体队列(模拟)

题目: 团体队列题目 思路: 这是一道模拟题,通过map,和两个queue完成,具体细节大家看代码注释,找清楚之间的关系就好。 #include <bits/stdc.h> using namespace std; const int maxt100010;//最多团队数int main() {int t,kcase0;//读入t个团while(scanf("%d"…

丑数-优先队列(详细解答)

题目: 丑数是一些因子只有2,3,5的数。数列1,2,3,4,5,6,8,9,10,12,15……写出了从小到大的前11个丑数&#xff0c;1属于丑数。现在请你编写程序&#xff0c;找出第1500个丑数是什么。 输出&#xff1a;The 1500’th ugly number is <…>.&#xff08;<…>为你找到的…

Unix Is命令(UVa 400)详细解答

题目: 输入正整数n 以及n 个文件名&#xff0c;排序后按列优先的方式左对齐输出。假设最长文件名有M 字符&#xff0c;则最右边有M 字符&#xff0c;其他列都是M2 字符。 题目分析: 有n个文件名,其中最长的文件名有M个字符,一下面输入为例,最长的是Mr._French(共有10个字符),然…

超级楼梯(递推)

题目: 有一楼梯共M级&#xff0c;刚开始时你在第一级&#xff0c;若每次只能跨上一级或二级&#xff0c;要走上第M级&#xff0c;共有多少种走法&#xff1f; 输入: 输入数据首先包含一个整数N&#xff0c;表示测试实例的个数&#xff0c;然后是N行数据&#xff0c;每行包含一…

铺方格(升级版递推)详细解答

题目: 有一个大小是2xN的网格,现在需要用2种规格的骨牌铺满,骨牌的规格分别是2x1和2x2,请计算一共有多少铺设的方法。(从左向右铺) 输入: T组数据,N网格列数 (0<N<50) 输出: 所有方案m Sample Input 1 3 2 Sample Output 1 5 3 解题思路: 这道题和超级楼梯有异曲同工…