深度遍历实现数字序列全排列(没有重复)

本文介绍了一种使用深度优先遍历算法遍历由数字构建的矩阵的方法。通过构建n*n大小的矩阵并利用深度优先遍历进行元素访问,确保了每个元素仅被访问一次。文章详细解释了如何通过矩阵进行遍历,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考图的深度优先遍历:先用 n 个数字构建出 n * n 大小的矩阵,然后通过矩阵进行深度遍历

通过判断子集中是否包含某一元素,来判断一个元素是否isVisited

public class Solution {
       public static void main(String[] args) {
        int[] nums = new int[]{1, 2, 3};
        System.out.println(permuteUnique(nums));
    }

    public static List<List<Integer>> permuteUnique(int[] nums) {
        int n = nums.length;
        int[][] matrix = new int[n][n];
        for (int i = 0; i < matrix.length; i++) {
            for (int j = i + 1; j < matrix.length; j++) {
                matrix[i][j] = 1;
                matrix[j][i] = 1;
            }
        }

        List<List<Integer>> res = new ArrayList<>();

        for (int i = 0; i < matrix.length; i++) {
            ArrayList<Integer> subRes = new ArrayList<>();
            dfs(matrix, nums, i, subRes, res);
        }

        return res;
    }

	//图矩阵的层次遍历
    public static void dfs(int[][] matrix, int[] nums, int index,
                           ArrayList<Integer> subRes, List<List<Integer>> res) {

        subRes.add(nums[index]);
        int vertexIndex = getFirstNeighbor(matrix, index);

        while (vertexIndex != -1) {
            System.out.println(vertexIndex);
            if (!subRes.contains(nums[vertexIndex])) {
                dfs(matrix, nums, vertexIndex, subRes, res);
                int lastIndex = subRes.size() - 1;
                subRes.remove(lastIndex);
            }
            vertexIndex = getNextNeighbor(matrix, index, vertexIndex);
        }

        if (subRes.size() == matrix.length) {
            ArrayList<Integer> temp = new ArrayList<>();
            for (Integer item : subRes) {
                temp.add(item);
            }
            res.add(temp);
        }

    }
   
    //得到第一个邻接结点的下标 vertexIndex
    public static int getFirstNeighbor(int[][] matrix, int index) {
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[index][i] > 0)
                return i;
        }
        return -1;
    }

	//根据前一个邻接结点的下标来获取下一个邻接结点
    public static int getNextNeighbor(int[][] matrix, int index, int firstNeighbor) {
        for (int i = firstNeighbor + 1; i < matrix.length; i++) {
            if (matrix[index][i] > 0)
                return i;
        }
        return -1;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值