Loading...

回溯-没有重复项数字的全排列

在这里插入图片描述

求解代码

 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
 ArrayList<ArrayList<Integer>> ans = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> permute (int[] num) {
        ArrayList<Integer> track = new ArrayList<>();
        boolean[] used = new boolean[num.length];
        backtrack(num,track,used);
        return ans;

    }

    private void backtrack(int[] num,ArrayList<Integer> track,boolean[] used){
        if(track.size()==num.length){
            ans.add(new ArrayList<>(track));
            return;
        }

        for(int i=0;i<num.length;i++){
            if(used[i]){
                continue;
            }
            track.add(num[i]);
            used[i]=true;
            backtrack(num,track,used);
            track.remove(track.size()-1);
            used[i]=false;
        }
    }

小贴士

回溯的核心是状态回退,也就是递归深入时修改的状态(比如本题的trackused),递归返回时必须恢复原状,只有这样才能保证下一轮循环的选择是干净的。

最后更新于 2026-04-05 17:35:33
Code Road Record