/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num int整型一维数组 * @param numLen int num数组长度 * @return int整型二维数组 * @return int* returnSize 返回数组行数 * @return int** returnColumnSizes 返回数组列数 */ void swap(int* a,int* b){ int tmp=*a; *a=*b; *b=tmp; } bool shouldskip(int* num,int start,int i){ for(int j=start;j<i;j++){ if(num[j]==num[i])return true; } return false; } void backtrack(int* num,int numLen,int n,int* returnsize,int* returnColumnSizes,int** result){ if(n==numLen){ result[*returnsize]=malloc(sizeof(int)*numLen); returnColumnSizes[*returnsize]=numLen; for(int i=0;i<numLen;i++){ result[*returnsize][i]=num[i]; } (*returnsize)++; return; } for(int i=n;i<numLen;i++){ if(shouldskip(num,n,i))continue;//检查是否有重复数字比如1.1.2这种 swap(num+i,num+n); backtrack(num,numLen,n+1,returnsize,returnColumnSizes,result); swap(num+i,num+n); } } int** permute(int* num, int numLen, int* returnSize, int** returnColumnSizes ) { // write code here int n=1; //阶乘算出总共有多少种排列组合 for(int i=1;i<=numLen;i++){ n=n*i; } int** result=(int**)malloc(sizeof(int*)*n); *returnColumnSizes=malloc(sizeof(int)*n); *returnSize=0; backtrack(num,numLen,0,returnSize,*returnColumnSizes,result); return result; }