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
如果你觉得本篇文章对你有帮助的话,可以点个赞,感谢支持~