import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param original int整型一维数组
* @return int整型二维数组
*/
public int[][] getAllShuffles(int[] original) {
List<List<Integer>> resultList = new ArrayList<>();
boolean[] isSelect = new boolean[original.length];
List<Integer> tempList = new ArrayList<>();
backTrack(resultList, isSelect, tempList, original);
int[][] result = new int[resultList.size()][original.length];
resultList.sort((o1, o2) -> {
// 逐个比较列表中的元素
for (int i = 0; i < o1.size() && i < o2.size(); i++) {
int cmp = o1.get(i).compareTo(o2.get(i));
if (cmp != 0) {
return cmp;
}
}
// 元素相同,那么比较长度
return Integer.compare(o1.size(), o2.size());
});
for (int i = 0; i < resultList.size(); i++) {
for (int j = 0; j < resultList.get(i).size(); j++) {
result[i][j] = resultList.get(i).get(j);
}
}
return result;
}
public void backTrack(List<List<Integer>> resultList, boolean[] isSelect,
List<Integer> tempList, int[] original) {
// 如果临时集合的大小已经和需要的数组长度一样,说明已经结束一次递归,可以把临时的集合添加到最后集合中
if (tempList.size() == original.length) {
resultList.add(new ArrayList<>(tempList));
return;
}
for (int i = 0; i < original.length; i++) {
// 如果此元素还未被选择过
if (!isSelect[i]) {
tempList.add(original[i]);
isSelect[i] = true;
// 进入下一层的递归
backTrack(resultList, isSelect, tempList, original);
// 回溯操作,去除选择过的标记和移除当前元素
isSelect[i] = false;
tempList.remove(tempList.size() - 1);
}
}
}
}
本题知识点分析:
1.递归
2.回溯
3.有序集合存取
4.自定义排序(字典序排序)
5.数学模拟
本题解题思路分析:
1.创建一个resultList用于存储结果,tempList存储每一次递归后的结果,isSeleced用来记录该元素是否被选择过
2.backTrack递归和回溯函数
3.如果当前集合的大小达到original原始数组的长度,那么就添加到集合resultLIst中
3.遍历从0到original尾巴,如果该元素未被选择过,添加到临时集合,然后标记为已选择,进入下一层递归,递归出来后,将已选择过,标记为未选择过,然后移除这个元素在集合中的位置
4.最后自定义排序,将集合按照字典序进行排序,利用Lambda表达式,比较两个集合中的每一个元素,如果元素值都相同,那么比较两个集合的长度即可
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话,可以点个赞,感谢支持~

京公网安备 11010502036488号