题解 | #没有重复项数字的全排列#

没有重复项数字的全排列

https://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1

思路

参考题解

代码

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        // 创建结果集合
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        // 先将数组进行排序获取最小组合
        Arrays.sort(num);
        // 进行方法递归
        recursion(result, num, 0);
        // 返回递归后的结果集合
        return result;
    }

    /**
     * 递归方法
     *
     * @param result 结果集合
     * @param num    目标数组
     * @param index  开始索引
     * @apiNote 用于找出所有全排列
     * @since 2023/1/17 11:54
     */
    public void recursion(List<ArrayList<Integer>> result, int[] num, int index) {
        // 如果索引还未结束则继续查找
        if (index < num.length) {
            // 遍历当前组合
            for (int i = index; i < num.length; i++) {
                // 交换二者
                exchange(num, index, i);
                // 递归调用方法进行查找排列
                recursion(result, num, index + 1);
                // 回溯
                exchange(num, index, i);
            }
        }
        // 当索引到达边界时,将当前组合加入集合
        else {
            num2ArrayList(result, num);
        }
    }

    /**
     * 加入方法
     *
     * @param result
     * @param num
     * @apiNote 将组合加入结果集合
     * @since 2023/1/17 12:00
     */
    public void num2ArrayList(List<ArrayList<Integer>> result, int[] num) {
        // 创建临时集合
        ArrayList<Integer> temp = new ArrayList<>(num.length);
        // 将元素加入临时集合
        for (int element : num) {
            temp.add(element);
        }
        // 将临时集合加入结果数组中
        result.add(temp);
    }

    /**
     * 交换array数组中索引i处与索引j处的值
     *
     * @param array 数组
     * @param i     索引
     * @param j     索引
     * @apiNote
     * @since 2022/9/11 13:57
     */
    public void exchange(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务