题解 | #所有的打乱情况#

所有的打乱情况

https://www.nowcoder.com/practice/ebf1466cc6e045c0859c92b3bb3a161c?tpId=363&tqId=10613645&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj

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

如果你觉得本篇文章对你有帮助的话,可以点个赞,感谢支持~

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 17:37
点赞 评论 收藏
分享
06-16 15:04
黑龙江大学 Java
零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务