每周一道算法題(十八)

本周題目難度級別"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閱讀 173,292評論 25 708
  • 1.把二元查找樹轉變成排序的雙向鏈表 題目: 輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。 要求不...
    曲終人散Li閱讀 3,362評論 0 19
  • 1、用C語言實現一個revert函數,它的功能是將輸入的字符串在原串上倒序后返回。 2、用C語言實現函數void ...
    希崽家的小哲閱讀 6,350評論 0 12
  • 找到JAVA的安裝路徑(目的是把scala放在一起方便管理) 01下載文件 scala 官方網站下載地址 02開始...
    葡小萄家的貓閱讀 7,727評論 0 0
  • 九月,一個初秋的季節,幾場雨后帶些慵懶與散漫,陽光依舊燦爛。天似乎高了,空氣變得微薄了,連心緒都仿佛安靜了下...
    我叫三土閱讀 966評論 0 1