最近碰到一个相对简单的算法题目,然后一不小心想到了一种比较特殊的解法
题目:求一个整数数组的全排列组合;
例 :[1,2,3]
则它的全排列组合为
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] 总共六个;
这个题目的解总数为n*(n-1)
我看了一下网上面的解法,大多都是使用递归、回溯法来完成本题;
这里我提供一下我的解法,因为直接在原数组上进行移位来完成,然后每一轮移动都是通过对调 nums[0]以及nums[i];
所以代码撇开打印结果的迭代,主算法的时间复杂度:O(n*(n-1)),空间复杂度:O(1)
代码如下:
public static void getArrge(int nums[]) {
int len = nums.length;//数组的长度
int index = 0;//可以忽略的指针,始终跟nums[i]换位的nums[0]
int enterLine = 0;// 打印当前数组情况的行号,满len个数字,换一行
int count = 0;//计数,每满len次轮换,则i 再次置零
int sum = 0;// 所有排列轮换的总数
int temp;
for (int i = 0; i < len; i++, count++, sum++) {
temp = nums[i];
nums[i] = nums[index];
nums[index] = temp;
if (i != 0) {
printArr(nums, enterLine, len);
}
if (count % len == 0) {
i = -1;
count = 0;
System.out.println();
}
if (sum == len * (len-1)) {
break;
}
}
}
public static void printArr(int[] arr, int enterLine, int len) {
for (int x : arr
) {
System.out.print(x + " ");
enterLine++;
if (enterLine == len) {
System.out.println();
enterLine = 0;
}
}
}
如果数组为[1,2,3,4,5],则运行的结果为:
2 1 3 4 5
3 1 2 4 5
4 1 2 3 5
5 1 2 3 4
1 5 2 3 4
2 5 1 3 4
3 5 1 2 4
4 5 1 2 3
5 4 1 2 3
1 4 5 2 3
2 4 5 1 3
3 4 5 1 2
4 3 5 1 2
5 3 4 1 2
1 3 4 5 2
2 3 4 5 1
3 2 4 5 1
4 2 3 5 1
5 2 3 4 1
1 2 3 4 5
因为每一轮对换结束后,原nums的位置都已经发生了变化,再继续将nums[0]与nums[i]进行对调,最后限制一下结果的总数,break出来即可;
当然这个算法也可能是有问题的,欢迎大家交流;