LeetCode每日一题.01(全排列)

全排列:

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

示例 1:

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

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

示例 2:

输入:nums = [0,1]

输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]

输出:[[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

解题思路:

        本题要求一个数组所有可能的排列顺序,可以想到用“回溯法”,回溯即是for循环+递归。

        1.创建List数组存放元素,再创建一个存放List数组的大数组;

        2.for()循环遍历nums所有元素,将遍历到的元素存入数组。

        3.在一个元素存入数组后递归进行下下一次往复操作(例如:将1存入数组后,nums数组中还有2,3,递归后再将2或3存入数组,由此往下,直到该List数组长度与nums数组长度一致时,将该数组存放到大数组中);

        4.返回该大数组

图示:

LeetCode每日一题.01(全排列)_第1张图片

代码实现:

class Solution {
    //创建局部数组,用来存放List数组
    List> list=new ArrayList<>();
    public List> permute(int[] nums) {
        //第一次遍历循环,每个元素都在第一位的情况
        for(int x=0;x l=new ArrayList<>();
            //数组添加元素
            l.add(nums[x]);
            //进入递归
            dfs(l,nums);
        }
        //返回局部数组
        return list;
    }
    public void dfs(List l,int []nums){
        //当数组l长度与数组nums长度相同时,表名数组搭建完成,存入局部数组
        if(l.size()==nums.length){
            list.add(new ArrayList<>(l));
        }
        //若未创建完成则继续for循环创建
        for(int x=0;x

LeetCode每日一题.01(全排列)_第2张图片 

LeetCode每日一题.01(全排列)_第3张图片 

你可能感兴趣的:(算法,数据结构,java)