《leetCode》:Permutations

题目

Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

思路

思路与《剑指Offer》上面的这个题目的思路一样:http://blog.csdn.net/u010412719/article/details/48980787

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
/*
求一个数组的全排列 
利用递归来做,
*/
int **result; 
int index_my=0;
void swap(int *a,int *b){
    int temp=*a;
    *a=*b;
    *b=temp;
}
int **my_premute(int *nums,int k,int length){
    if(nums==NULL||length<1){
        return NULL;
    }
    if(k==length){//其中的一种情况,保存
         result[index_my]=(int *)malloc(length*sizeof(int));
         if(result[index_my]==NULL){
            exit(EXIT_FAILURE);
         }
         for(int i=0;i<length;i++){
            result[index_my][i]=nums[i];
         }
         index_my++;
    }
    else{
        for(int i=k;i<length;i++){          
                swap(&nums[i],&nums[k]);//都与第k个元素进行交换,然后进行下一轮的递归。 
                my_premute(nums,k+1,length);
                swap(&nums[i],&nums[k]);//还原
            }
        }
}
int** permute(int* nums, int numsSize, int* returnSize) {
    if(nums==NULL||numsSize<1){
        return NULL;
    } 
    int num=1;
    for(int i=1;i<=numsSize;i++){
        num*=i;
    }
    index_my=0;
    result=(int **)malloc(num*sizeof(int *));
    if(result==NULL){
        printf("malloc fail");
        exit(EXIT_FAILURE);
    }

    my_premute(nums,0,numsSize);
    *returnSize=index_my;
    return result;

}

测试代码如下:

int main(void){
    int k;
    while(scanf("%d",&k)!=EOF){
        int *arr=(int *)malloc(k*sizeof(int));
        if(arr==NULL){
            exit(EXIT_FAILURE);
        }
        for(int i=0;i<k;i++){
            scanf("%d",arr+i);
        }
        int returnSize=0;
        int **temp=permute(arr,k,&returnSize);
        for(int i=0;i<returnSize;i++){
            for(int j=0;j<k;j++){
                printf("%d  ",temp[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
}

遇到一个比较奇葩的问题也: ‘index’ redeclared as different kind of symbol

我找了半天,没有找到index被我重复定义了。但是就是报错。无奈之下只能换一下这个名字了,将index换成index_my,再运行就OK了。

想了下,产生这个问题的原因应该是,leetCode后台的测试代码中,也用到了这个变量,而我这里的index是声明的是全局变量,因此产生了冲突。

AC结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值