java字符串全排列输出分治法,分治法实例-全排列

1.问题描述

给出n个元素的所有可能的排列方式。

如: [1,2,3]的排列有[1,2,3], [1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]

1.1时间复杂度

O(n!)

2.算法思路

我们开始有一个nums数组,其中保存着需要进行排列的数字1,2,3。首先从第一位开始排,第一位可选的值有三种可能即1,2或3,设置一个变量start_index=0,表示我们目前排到了第start-index位,然后分别让nums[start_index]的数字和后面几个的数字交换位置,每交换好一次,就形成了一个新的值,开始往下一位继续递归,递归完毕后需要恢复到原来的位置,再让nums[start_index]和下一位交换位置。

总结来说就是三个步骤:

① 交换元素位置

② 递归

③ 恢复元素位置

1e207e0abaac

全排序.png

3.具体实现

public class Permutation {

public static List permute(int[] nums){

List perms = new ArrayList<>();

permute_recursion(nums,0,perms);

return perms;

}

private static void permute_recursion(int[] nums, int index, List list) {

int len = nums.length;

if(index == len-1){

int [] perm = new int[len];

for(int i=0;i

perm[i] = nums[i];

}

list.add(perm);

}

else{

for(int i = index;i <=len-1;i ++){

swap(nums,index,i);

permute_recursion(nums,index+1,list);

swap(nums,index,i);

}

}

}

private static void swap(int[] nums, int m, int n) {

int temp = nums[m];

nums[m]=nums[n];

nums[n] = temp;

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值