每周一道算法题(十八)

本周题目难度级别"Medium",没错,比较难。。。

题目:就是给你一个数字n,让你输出n个左右括号"()"的排列组合。

思路:给一个n,则有n个左括号和n个右括号,排列组合用到了递归,把所有的组合列出来你就会发现两个原则,一是所有的组合都是从左括号开始,并且都是从1个左括号、2个左括号。。。一直到n个左括号;二是每个右括号的前面都会有一个左括号对应,例如第6个右括号前一定有大于等于6个的左括号与之对应。思路其实不难,关键是实现难,下面来看看代码(从英文注释下方开始看):

void generate(char** result,int* size,int l,int r,char* tmp,int index){  
//当左括号和右括号都用完的时候停止
    if(l==0 && r==0){  
        //设置结束位
        tmp[index]=0;  
        result[*size]=(char*)malloc(sizeof(char)*index);  
        //复制
        strcpy(result[*size],tmp);  
        (*size)++;  
        return;  
    }  
    //左括号的个数大于0(原则一)
    if(l>0){  
        //对应位置设为左括号
        tmp[index]='('; 
        //递归
        generate(result,size,l-1,r,tmp,index+1);  
    }  
    //右括号的个数大于0,并且左括号的个数小于右括号的个数(原则二)
    if(r>0 && l<r){  
        tmp[index]=')';  
        //递归
        generate(result,size,l,r-1,tmp,index+1);  
    }  
}  
/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
char** generateParenthesis(int n, int* returnSize) {
    char** result;  
    //存放一种组合
    char* tmp=(char*)malloc(sizeof(char)*(n*2+1));  
    //l是左括号的个数,r是右括号的个数
    int l=n,r=n;  
    //无法确定有多少种组合,就写的大一点
    result =(char**)malloc(sizeof(char*)*1000000);  
    *returnSize=0;  
    //最后的0是从对应的位置,因为这是从第一个开始,所以是0
    generate(result,returnSize,l,r,tmp,0);  
    return result;  
}

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,569评论 25 709
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 8,632评论 0 19
  • 1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...
    希崽家的小哲阅读 11,483评论 0 12
  • 找到JAVA的安装路径(目的是把scala放在一起方便管理) 01下载文件 scala 官方网站下载地址 02开始...
    葡小萄家的猫阅读 12,257评论 0 0
  • 九月,一个初秋的季节,几场雨后带些慵懒与散漫,阳光依旧灿烂。天似乎高了,空气变得微薄了,连心绪都仿佛安静了下...
    我叫三土阅读 4,479评论 0 1