letcode 全排列

  • 题目描述:
    给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

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

思路:通过分析可知,这道题需要用递归求解,因为递归可以回到上一步的状态,而且,我们需要一个函数来交换数组中的两个数,之后,我们就要思考怎么构造递归函数了,因为需要全排列,所有第一个数下标为0,有n中可能,所有需要和0~n-1的数交换,同样,第二个数需要与1~n-1交换,需要注意的一点是,在递归中需要交换数组中的两个数两次来维护数组递归的正确性

  • 代码实现:
class Solution {
     List<List<Integer>> result = new ArrayList<List<Integer>>();
    public List<List<Integer>> permute(int[] nums) {
        int len = nums.length;
        if(len==0||nums==null) return result;
        quan(nums,0,nums.length);
        System.out.println("----");
        return result;
    }
    private  void quan(int[] nums,int i,int len) {
         //当i==len-1是说明已经确定了一个数组,加入结果数组中
        if(i==len-1) {
            List<Integer> temp = new ArrayList<Integer>();
            for(int j=0;j<len;j++) {
                temp.add(nums[j]);
            }
            result.add(temp);
        }
        //每个数于它后面的数交换,之后查找符合条件的数组,注意交换两遍保证递归正确
        for(int v=i;v<len;v++) {
            exchange(nums, i, v);
            quan(nums,i+1,len);
            exchange(nums,i,v);
        }

    }
    public  void exchange(int[] nums,int v,int m) {
        int temp = nums[v];
        nums[v] = nums[m];
        nums[m] = temp;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37520037/article/details/82730654
今日推荐