当前位置: 代码迷 >> 综合 >> letcode 全排列
  详细解决方案

letcode 全排列

热度:73   发布时间:2023-11-18 03:11:45.0
  • 题目描述:
    给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [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;}
}