leetCode46:全排列

题目:

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

思路:

  • 回溯法
  • Collections.swap 这一个工具方法,别写错了。

代码:

    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> resultList = new ArrayList<>();
        if (nums==null) {
            return resultList;
        }
        //记录下所有要排列的数字
        List<Integer> numList = new ArrayList<>();
        for (int num: nums) {
            numList.add(num);
        }

        int length = nums.length;
        //排列
        backTrack( length, resultList, numList, 0);
        
        return resultList;
    }


    public void backTrack( int length, List<List<Integer>> resultList, List<Integer> numList, int num) {
        //如果已经排列完了,就添加到结果集中
        if (length == num) {
            resultList.add ( new ArrayList<>(numList));
        }

        // [0,1 ∣ 2,3,4] ,左边的是填过的数,右边的是没有填的数。
        // 假设待填的数的下标为 i,那么填完以后我们将第 i 个数和第 num 个数交换,
        // 使得在填第 num+1 个数的时候 nums 数组的 [0,num] 部分为已填过的数,[num+1, length−1] 为待填的数。

        // 易错点:这里的循环,从 num  开始的。别写错了。
        for (int i=num ; i < length; i++) {
            //将numList划分成左右两个部分,左边的表示已经填过的数,右边表示待填的数,
            //交换,表示 i 已经填过
            //Collections.swap 这一个工具方法,别写错了。
            Collections.swap ( numList, num, i);
            //循环,选择后续数据
            backTrack( length, resultList, numList, num+1);
            //撤销交换。回溯的时候交换回来即能完成撤销操作
            Collections.swap ( numList, num, i );

        }

    }

posted on   乐之者v  阅读(3)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-02-19 java使用Mysql批量更新(不存在就插入,存在就更新)
2021-02-19 Mybatis批量插入,批量更新
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示