每周一道算法題(三十二)

本周題目難度級別'Medium',使用語言:C

題目:給你一個集合candidates和一個數字target,讓你用集合中的數字組成一些新的集合白热,要求新的集合中的各項數字的和為target,candidates中的數字可以重復使用。在接下來的舉例中我會將C語言里面的參數一并解釋出來镀梭。

eg:給你一個集合candidates[2, 3, 6, 7]和一個數target:7(并告知你們candidates中數字的個數candidatesSize:4),你找出來返回的組合是:[ [7],[2, 2, 3] ]并且要將這個集合里包含的集合個數2賦值給returnSize踱启,還要將這個集合里包含的每一個集合里數字的個數(1报账,3)賦值給columnSizes,需要注意的是返回的組合和columnSizes需要手動開辟空間埠偿。

思路:這道題我們也用到了回溯算法透罢,就是一個一個帶入然后和target進行比較,如果等于target就記錄冠蒋;如果小于就再加一個數羽圃;如果大于就回退一個數然后再帶入下一個數字。
下面根據代碼來解釋(從combinationSum這個函數開始看抖剿,英文的注釋我已經在例子中都解釋了):

//排序(這個排序我們已經是第三次用了朽寞,不解釋)
 void quickSort(int* nums,int first,int end){
    int temp,l,r;
    if(first>=end)return;
    temp=nums[first];
    l=first;r=end;
    while(l<r){
        while(l<r && nums[r]>=temp)r--;
        if(l<r)nums[l]=nums[r];
        while(l<r && nums[l]<=temp)l++;
        if(l<r)nums[r]=nums[l];
    }
    nums[l]=temp;
    quickSort(nums,first,l-1);
    quickSort(nums,l+1,end);
}
//這是我寫的回溯算法相應的參數在主函數有解釋
void combinationSumTool(int* candidates, int candidatesSize, int target, int** columnSizes, int k,int* sum, int* index, int* result, int* count, int** returnArray) {
    //開始遍歷
    for (int i = k; i < candidatesSize; i++) {
        *sum += candidates[i];
        result[*index] = candidates[i];
        *index += 1;
        //各項和等于target
        if (*sum == target) {
            //記錄集合內數字的個數
            columnSizes[0][*count] = *index;
            //記錄這個集合
            returnArray[*count] = malloc(sizeof(int) * *index);
            for(int j = 0; j < *index; j++) {
                returnArray[*count][j] = result[j];
            }
            //集合的個數+1
            *count += 1;
            //index和sum回退一個拼湊新的集合
            *index -= 1;
            *sum -= candidates[i];
            break;
        //各項和小于target
        }else if (*sum < target) {
            //調用回溯算法將集合的數字再加一個
            combinationSumTool(candidates, candidatesSize, target, columnSizes, i, sum, index, result, count, returnArray);
            //index和sum回退一個拼湊新的集合
            *index -= 1;
            *sum -= candidates[i];
        //各項和大于target
        }else {
            //index和sum回退一個拼湊新的集合
            *index -= 1;
            *sum -= candidates[I];
            break;(由于是從小到大排序的,后面的更大斩郎,就不用繼續(xù)遍歷了)
        }
    }
}
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *columnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** combinationSum(int* candidates, int candidatesSize, int target, int** columnSizes, int* returnSize) {
    //排序
    quickSort(candidates,0,candidatesSize-1);
    //開辟空間
    columnSizes[0] = malloc(sizeof(int) * 150);
    //累加和
    int *sum = malloc(sizeof(int));
    *sum = 0;
    //記錄下標
    int *index = malloc(sizeof(int)); 
    *index = 0;
    //記錄數組
    int *result = malloc(sizeof(int) * target);
    //記錄個數
    int *count = malloc(sizeof(int));
    *count = 0;
    //定義返回數組
    int** returnArray = malloc(sizeof(int*) * 150);
    //調用回溯算法(0是從第幾個開始遍歷)
    combinationSumTool(candidates, candidatesSize, target, columnSizes, 0, sum, index, result, count, returnArray);
    *returnSize = *count;
    return returnArray;
}

效率還是比較高的脑融,題目本身不難,難點是對columnSizes這個參數的理解缩宜,完全無法理解為什么columnSizes要用二維指針而不用一維指針肘迎,一維指針完全夠用了。锻煌。妓布。

版權聲明:本文為 Crazy Steven 原創(chuàng)出品,歡迎轉載宋梧,轉載時請注明出處!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末匣沼,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子乃秀,更是在濱河造成了極大的恐慌肛著,老刑警劉巖圆兵,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異枢贿,居然都是意外死亡殉农,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門局荚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來超凳,“玉大人,你說我怎么就攤上這事耀态÷职” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵首装,是天一觀的道長创夜。 經常有香客問我,道長仙逻,這世上最難降的妖魔是什么驰吓? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮系奉,結果婚禮上檬贰,老公的妹妹穿的比我還像新娘。我一直安慰自己缺亮,他們只是感情好翁涤,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萌踱,像睡著了一般葵礼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虫蝶,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天章咧,我揣著相機與錄音,去河邊找鬼能真。 笑死,一個胖子當著我的面吹牛扰柠,可吹牛的內容都是我干的粉铐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼卤档,長吁一口氣:“原來是場噩夢啊……” “哼蝙泼!你這毒婦竟也來了?” 一聲冷哼從身側響起劝枣,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤汤踏,失蹤者是張志新(化名)和其女友劉穎织鲸,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體溪胶,經...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搂擦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了哗脖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瀑踢。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖才避,靈堂內的尸體忽然破棺而出橱夭,到底是詐尸還是另有隱情,我是刑警寧澤桑逝,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布棘劣,位于F島的核電站,受9級特大地震影響楞遏,放射性物質發(fā)生泄漏呈础。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一橱健、第九天 我趴在偏房一處隱蔽的房頂上張望而钞。 院中可真熱鬧,春花似錦拘荡、人聲如沸臼节。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽网缝。三九已至,卻和暖如春蟋定,著一層夾襖步出監(jiān)牢的瞬間粉臊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工驶兜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扼仲,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓抄淑,卻偏偏與公主長得像屠凶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肆资,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容