前周
回溯特点:就是方法调用本身自己实现一个回溯效果,注意调用之后的回溯方法中一定要有结束条件否则会出现栈溢出错误
栈特点: 就是中数据结构其存入顺序是先进后出
双端队列:就是结合了普通队列和栈的特点的数据结构
注意事项及一些思路
用到了双端队列(存储各个回溯层的索引信息)
思路
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();
}
}
}