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<List<Integer>> permute(int[] nums) {
        List<List<Integer>> rs = new ArrayList<List<Integer>>();
        //需要声明新方法,传入start和end
        perm(rs, nums, 0, nums.length - 1);
        return rs;
    }

    public static void perm(List<List<Integer>> list, int[] nums, int start, int end) {
        //存放每一排列的集合
        List<Integer> 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 });
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容