46.全排列

题目描述:

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

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

解答:递归

package code046_Permutations;

import java.util.ArrayList;
import java.util.List;

import com.sun.org.apache.bcel.internal.generic.SWAP;

import sun.launcher.resources.launcher;

/**
 * @author:zd
 * @date:2019年1月3日下午9:35:31
 * @parameter
 * @return
 */
public class Main {
    public static List> permute(int[] nums) {
        List> rs = new ArrayList>();
        //需要声明新方法,传入start和end
        perm(rs, nums, 0, nums.length - 1);
        return rs;
    }

    public static void perm(List> list, int[] nums, int start, int end) {
        //存放每一排列的集合
        List internal = new ArrayList<>();
        //start增到可以将排列存入list
        if (start == end) {
            for (int i = 0; i <= end; i++) {
                internal.add(nums[i]);
            }
            list.add(internal);
        } else {
            //for循环数组长度,内部会再递归一次【for循环长度-1】,依次内部类推递归【for循环次数减少至1,这时会添加到list】。
            //下一次循环时使用的nums是上一次循环的结果。
            for (int i = start; i <= end; i++) {
                //交换位置
                swap(nums, start, i);
                //内部交换时使用nums_tmp
                int nums_temp[] = nums.clone();
                //递归调用,tmp传参数,start+1是为了添加到list。
                perm(list, nums_temp, start + 1, end);
            }
        }
    }
    /*
     nums[123]
     s=0
     i=0
     tmp=[123]
     
        s=1
        i=1
        tmp=[123]
        
            s=2[add to list]
            [123]
            
        s=1
        i=2
        tmp=[132]
            s=2[add to list]
            [123,132]
            
            
     nums[123]
     s=0
     i=1
     tmp=[213]
     
        s=1
        i=1
        tmp=[213]
        
            s=2[add to list]
            [123,132,213]
            
        s=1
        i=2
        tmp=[231]
            s=2[add to list]
            [123,132,213,231]
            
            
     nums[213]
     s=0
     i=2
     tmp=[312]
     
        s=1
        i=1
        tmp=[312]
            
            s=2[add to list]
            [123,132,213,231,312]
            
        s=1
        i=2
        tmp=[321]
            s=2[add to list]
            [123,132,213,231,312,321]
            
     */

    private static void swap(int[] nums, int start, int i) {
        int tmp = nums[start];
        nums[start] = nums[i];
        nums[i] = tmp;

    }

    public static void main(String[] args) {
        permute(new int[] { 1, 2, 3 });
    }
}

你可能感兴趣的:(46.全排列)