39.数字排列

输入一组数字(可能包含重复数字),输出其所有的排列方式。

数据范围:

输入数组长度 [0,6]。
数组元素取值范围 [1,10]。

样例:

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

代码:

class Solution {
    //存储所有排列结果的列表
    List<List<Integer>>res = new ArrayList<>();
    //标记数组,标记数字是否使用过
    boolean[] vis;
    public List<List<Integer>> permutation(int[] nums) {
        //当前正在生成的排列
        List<Integer>list = new ArrayList<>();
        //初始化访问标记数组
        vis = new boolean[nums.length];
        //排序
        Arrays.sort(nums);
        //递归搜索
        dfs(nums,0,list);
        //返回所有排列结果
        return res;
    }
    public void dfs(int[] nums,int n,List<Integer>list){
        //终止条件:当前排列长度等于数组长度,说明找到一个完整排列
        if(n == nums.length){
            //添加到结果集
            res.add(new ArrayList<>(list));
            return;
        }
        //遍历所有可能的数字
        for(int i = 0;i<nums.length;i++){
            //如果当前数字已经被使用,或者遇到重复数字且前一个数字未被使用,则跳过
            if(vis[i]||(i>0&&nums[i-1]==nums[i]&&!vis[i-1]))continue;
            //选择当前数字
            vis[i] = true;
            list.add(nums[i]);
            //递归进入下一层
            dfs(nums,n+1,list);
            //回溯,撤销选择
            list.remove(list.size()-1);
            vis[i] = false;
        }
    }
}
posted @ 2025-05-28 09:09  回忆、少年  阅读(14)  评论(0)    收藏  举报