定个小目标之刷LeetCode热题(32)

46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]

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

今天看这道题目,先说下思路,主要采用递归回溯思想,回溯对于本题来说就是每次操作完数组之后再将其复原

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        // 用于存放输入数组元素,便于操作
        List<Integer> output = new ArrayList<Integer>();
        // 用于存放多个不同排序组合的数组
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        int length = nums.length;
        for (int num : nums) {
            output.add(num);
        }
        backtrack(length, output, res, 0);
        return res;
    }

    private void backtrack(int length, List<Integer> output, List<List<Integer>> res, int first) {
        // 这里主要采用递归方式不断构造不同排序组合数组,然后存放到res里
        // first表示被交换的元素,比如 1 2 3,first = 0时表示1这个位置将分别与1、2、3交换,即123、213、321
        // 每次交换都需要复原防止下次进行交换时出现一样组合的数组
        if (length == first) {
            res.add(new ArrayList<Integer>(output));
        }
        for (int i = first; i < length; i++) {
            Collections.swap(output, first, i);
            backtrack(length, output, res, first + 1);
            Collections.swap(output, first, i);
        }
    }

}

题目链接:题单 - 力扣(LeetCode)全球极客挚爱的技术成长平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值