- 说明:
- 这里的用例是数字数组。
- 全排序样式如; 数组[ 1,1,3]
他的全排序为:[1,1,3] , [1,3,1] ,[3,1,1] - 对于全排序最简单的做法就是通过循环迭代去实现,思想是:
将所有的不同下标的数字都视为不一样的个体。然后用循环,每一个作为一次第一个元素,然后去排序其他的个体。在最里面的循环体中编成一个新的数组,并加入我们的设置的全局变量二维数组中存储起来,最后去重皆可。
如果我们数组长为n,那么需要最大的时间为; n的n次方,最小为 n! 很显然这样做需要使用到大量的嵌套循环去实现,代码量大,而且耗时长。
- 这里介绍一种递归的方法
他计算使用到的时间为:n的平方
public List<List<Integer>> sort(int[] num){
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
helder(num,res, temp, 0);
return res;
}
public void helder(int[] num,List<List<Integer>> res,List<Integer> temp,int index) {
if(index >= num.length) {
res.add(temp);
}
Set<Integer> set = new HashSet<Integer>();
for(int i = index; i < num.length; i++) {
if(set.contains(num[i])) {
continue;
}
set.add(num[i]);
temp.add(num[i]);
wrap(num, index, i);
helder(num, res, temp, index+1);
temp.remove(index);
wrap(num, index, i);
}
}
public void wrap(int[] num,int i ,int j) {
int x = num[i];
num[i] = num[j];
num[j] = x;
}
|