给出一组数字,返回该组数字的所有排列
例如:
[1,2,3]的所有排列如下
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)
数据范围:数字个数
要求:空间复杂度
,时间复杂度
[1,2,3]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
[1]
[[1]]
#include <stdio.h> #include <stdlib.h> #include <string.h> int flag=0; void swap(int* a, int* b){ int tmp; tmp = *a; *a = *b; *b = tmp; } void func(int* num,int numLen, int k, int** retNum){ if (k == numLen) { retNum[flag] = (int*) malloc(sizeof(int) * numLen); for (int j = 0; j<numLen; j++) { retNum[flag][j] = num[j]; } flag++; return ; } for (int i = k; i<numLen; i++) { swap(&num[i], &num[k]); func(num, numLen, k+1, retNum); swap(&num[i], &num[k]); } return ; } int** permute(int* num, int numLen, int* returnSize, int** returnColumnSizes ) { // write code here int ret = 0; int k = numLen; *returnSize = 1; int tmp; for (int i = 1; i <= numLen; i++) { *returnSize = *returnSize * i; } int** retNum = (int**)malloc(sizeof(int*) * (*returnSize)); *returnColumnSizes = (int*)malloc((*returnSize)*sizeof(int)); for(int i=0; i<(*returnSize); i++) (*returnColumnSizes)[i] = numLen; func(num, numLen, 0, retNum); for (int i = 0; i < *returnSize; i++) { for (int j = i+1; j < *returnSize; j++) { for (int k = 0; k < numLen; k++) { if (retNum[i][k] == retNum[j][k]) { continue; } if (retNum[i][k] < retNum[j][k]) { break; } if (retNum[i][k] > retNum[j][k]) { for (int a = 0; a < numLen; a++) { tmp = retNum[i][a]; retNum[i][a] = retNum[j][a]; retNum[j][a] = tmp; } break; } } } } return retNum; }
#include <string.h> int** propermute(int* num, int numLen) { int **res, **lastres, returnSize, i, j; returnSize = 1; for(i=1; i<=numLen; i++) returnSize *= i; if(numLen==0) return NULL; res = (int**)malloc(returnSize*sizeof(int*)); for(i=0; i<returnSize; i++) res[i] = (int*)malloc(numLen*sizeof(int)); if(numLen==1) { res[0][0] = num[0]; return res; } lastres = propermute(num+1, numLen-1); for(i=0; i<returnSize/numLen; i++) { for(j=0; j<numLen; j++) { memcpy(res[i*numLen+j], lastres[i], j*sizeof(int)); res[i*numLen+j][j] = num[0]; memcpy(res[i*numLen+j]+j+1, lastres[i]+j, (numLen-j-1)*sizeof(int)); } } return res; } int** permute(int* num, int numLen, int* returnSize, int** returnColumnSizes ) { int **res, i; *returnSize = 1; for(i=1; i<=numLen; i++) (*returnSize) *= i; *returnColumnSizes = (int*)malloc((*returnSize)*sizeof(int)); for(i=0; i<(*returnSize); i++) (*returnColumnSizes)[i] = numLen; res = propermute(num, numLen); return res; }