JAVA实现笛卡尔积-(使用回溯加双端算法)

前周

回溯特点:就是方法调用本身自己实现一个回溯效果,注意调用之后的回溯方法中一定要有结束条件否则会出现栈溢出错误
栈特点:  就是中数据结构其存入顺序是先进后出
双端队列:就是结合了普通队列和栈的特点的数据结构
注意事项及一些思路

用到了双端队列(存储各个回溯层的索引信息)
思路
1:存储各个回溯层的对应的索引
2:判断当前是否是在最后一层回溯层
3:不管在那一次循环一层就要对当前层的索引更新

代码实现

//实现笛卡尔积
public class CartesianDemo {

    public static void main(String[] args) {
        String [] [] macthingArray={
                {"中国","香港","澳门","美国"},
                {"红色","黑色"},
                {"16GB","32GB","321GB"}
        };
        List<List<String>> arrayLists = MyCatesianDemo.cartesianUseDeque(macthingArray);
        for(List<String> arr:arrayLists){
            System.out.println(arr.toString());
        }

    }
}

class MyCatesianDemo{

    //形成笛卡尔积方法 实现方式 使用双端队列+回调
    public static List<List<String>>  cartesianUseDeque(String [][] content){
        //创建一个结果集合
        List<List<String>> result=new ArrayList<>();
        //创建一个双端队列
        Deque<Integer> deque=new ConcurrentLinkedDeque<>();
        cartesianUseDeque(content, result, deque);
        return result;
    }
    //一个私有静态 笛卡尔积方法(使用双端队列实现)
    private static void cartesianUseDeque(String [][] content, List<List<String>> results,Deque<Integer> layerIndexs){

        //循环当前索引层的内容信息
        for(int index=0;index<content[layerIndexs.size()].length;index++){

            //将当前层对应的索引存储到layerIndexs队列中
            layerIndexs.addLast(index);

            //判断当前层是否是content.length层
            if(layerIndexs.size()>=content.length){

                //创建一个组合集合
                List<String> groupList=new ArrayList<>();
                //创建一个数组存储每层对应的索引
                Integer[] layerArrs=new Integer[layerIndexs.size()];
                layerArrs= Arrays.copyOfRange(layerIndexs.toArray(),0,layerIndexs.size(),Integer[].class);

                for(int currIndex=0;currIndex<layerArrs.length;currIndex++){
                    groupList.add(content[currIndex][layerArrs[currIndex]]);
                }

                //将当前groupList存储到结果集中
                results.add(groupList);
            }else{
                //由于当前回调不是最底层继续回调
                cartesianUseDeque(content,results,layerIndexs);
            }
            //操作完以后将当前层对应的索引给移除
            layerIndexs.removeLast();

        }

    }
}

结果在这里插入图片描述

提示:有什么写的不对的地方你可以说,相互交流,不懂的也可以评论, 代码很简短但是思路一定要清晰,主要用到了回溯和栈的概念

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值