package leecode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * 46. 全排列
 *
 * 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
 *
 * @author Tang
 * @date 2021/12/8
 */
public class Permute {
    List<List<Integer>> result = new ArrayList<>();
    int[] nums;
    /**
     * 回溯算法
     * 1.已选路径
     * 2.可选列表
     * 3.结束条件
     * 
     * 循环遍历{
     *     递归之前做出选择
     *     执行递归()
     *     递归之后撤销选择
     * }
     * 
     * 
     * @param nums
     * @return
     */
    public List<List<Integer>> permute(int[] nums) {
        this.nums = nums;
        //已选列表
        List<Integer> hasChooseList = new ArrayList<>();
        track(hasChooseList);
        return result;
    }
    /**
     * 递归
     */
    private void track(List<Integer> hasChooseList) {
        //完成一次排列 更新结果
        if(hasChooseList.size() == nums.length) {
            Object[] array = hasChooseList.toArray();
            List list = Arrays.asList(Arrays.copyOf(array, array.length));
            result.add(list);
            return;
        }
        //找出nums中没有的元素
        for (int num : nums) {
            if(hasChooseList.contains(num)) {
                continue;
            }
            //递归之前做出选择 num
            hasChooseList.add(num);
            //执行递归
            track(hasChooseList);
            //递归之后撤销选择
            hasChooseList.remove((Integer) num);
        }
    }
    public static void main(String[] args) {
    }
}