版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/84525920
题目及测试
package pid046;
import java.util.List;
/*全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
*/
public class main {
public static void main(String[] args) {
int[] testTable=new int[]{1,2,3,4};
test(testTable);
}
private static void test(int[] ito) {
Solution solution = new Solution();
int length=ito.length;
List<List<Integer>> rtn;
for(int i=0;i<length;i++){
System.out.print( ito[i]+" ");
}
System.out.println();
long begin = System.currentTimeMillis();
rtn=solution.permute(ito);//执行程序
long end = System.currentTimeMillis();
for(int i=0;i<rtn.size();i++){
for(int j=0;j<rtn.get(i).size();j++){
System.out.print( rtn.get(i).get(j)+" ");
}
System.out.println();
}
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,8ms,较慢)
在类中建立一个result的变量,放置结果
建立permutateRemain函数,变量为上一次的全排列几位的list(now)和还能排的数字的list(remain)
在函数中,
如果remain剩余的量为0,将now加入result
对remain进行遍历,在遍历中
遍历的数字为now
先建立一个对now的copy newlist,将newlist加入now
然后将remain除去now,进行新的permutateRemain,然后在remain重新加入now,结束遍历
package pid046;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
public class Solution {
List<List<Integer>> result=new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
int length=nums.length;
if(length==0){
return result;
}
List<Integer> now=new ArrayList<>();
List<Integer> remain=new ArrayList<>(nums.length);
for(int num:nums){
remain.add(num);
}
permuteRemain(now,remain);
return result;
}
public void permuteRemain(List<Integer> now,List<Integer> remain){
if(remain.size()==0){
result.add(now);
return;
}
List<Integer> newList;
for(int i=0;i<remain.size();i++){
Integer num=remain.get(i);
remain.remove(i);
newList=new ArrayList<>();
newList.addAll(now);
newList.add(num);
permuteRemain(newList, remain);
remain.add(i, num);
}
}
}
解法2(别人的)
省去了不断copy list的时间,加了判断now有无这个num的时间
package go.jacob.day819;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 46. Permutations
* @author Jacob
* 题意:求数组的全排列
*/
public class Demo1 {
List<List<Integer>> res;
public List<List<Integer>> permute(int[] nums) {
res = new ArrayList<List<Integer>>();
if (nums == null || nums.length < 1)
return res;
//对数组元素进行从小到大排序
Arrays.sort(nums);
ArrayList<Integer> list = new ArrayList<Integer>();
solve(list, nums);
return res;
}
private void solve(ArrayList<Integer> list, int[] nums) {
if (list.size() == nums.length) {
res.add(new ArrayList<Integer>(list));
return;
}
for (int i = 0; i < nums.length; i++) {
if (!list.contains(nums[i])) {
list.add(nums[i]);
solve(list, nums);
list.remove(list.size() - 1);
}
}
}
}
解法3,解法4
字典序 的非递归全排列
递归的交换全排列
http://www.cnblogs.com/pmars/archive/2013/12/04/3458289.html