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

本周題目難度"Medium",使用語言:C

題目:本周的題目和上周的基本上是一樣的洼怔,就是給你一個(gè)組合和一個(gè)數(shù),讓你找出加起來和為那個(gè)數(shù)的組合篇裁,具體解釋看上周的題目,懶得解釋了^v^.區(qū)別呢就是這次不能重復(fù)使用組合里的數(shù)了间护,然后就是和上周的一樣不能出現(xiàn)重復(fù)的組合是己。

思路:和上周的一樣雳攘,多一步去重就好了。所以就不解釋了枫笛,直接上代碼吨灭。

//排序(這個(gè)排序我們已經(jīng)是第四次用了,不解釋)
 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);
}
//這是我寫的回溯算法相應(yīng)的參數(shù)在主函數(shù)有解釋
void combinationSumTool(int* candidates, int candidatesSize, int target, int* tempColumnSizes, int k,int* sum, int* index, int* result, int* count, int** tempArray) {
    
    //開始遍歷
    for (int i = k; i < candidatesSize; i++) {
        //這里避免了一次的重復(fù)刑巧,意思就是如果一個(gè)數(shù)字重復(fù)出現(xiàn)第二次就不用遍歷了喧兄,其實(shí)可以考慮在這里進(jìn)行去重的,有興趣的小伙伴可以想想啊楚,這里去重會(huì)大大提高算法的效率
        if (i != 0 && *index == 0 && candidates[i]==candidates[i-1]) continue;
        *sum += candidates[i];
        result[*index] = candidates[i];
        *index += 1;
        //各項(xiàng)和等于target
        if (*sum == target) {
            //記錄集合內(nèi)數(shù)字的個(gè)數(shù)
            tempColumnSizes[*count] = *index;
            //記錄這個(gè)集合
            tempArray[*count] = malloc(sizeof(int) * *index);
            for(int j = 0; j < *index; j++) {
                tempArray[*count][j] = result[j];
            }
            //集合的個(gè)數(shù)+1
            *count += 1;
            //index和sum回退一個(gè)拼湊新的集合
            *index -= 1;
            *sum -= candidates[i];
            break;
        //各項(xiàng)和小于target
        }else if (*sum < target) {
            //調(diào)用回溯算法將集合的數(shù)字再加一個(gè)
            combinationSumTool(candidates, candidatesSize, target, tempColumnSizes, i+1, sum, index, result, count, tempArray);
            //index和sum回退一個(gè)拼湊新的集合
            *index -= 1;
            *sum -= candidates[i];
        //各項(xiàng)和大于target
        }else {
            //index和sum回退一個(gè)拼湊新的集合
            *index -= 1;
            *sum -= candidates[i];
            break;
        }
    }
}
/**
 * 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** combinationSum2(int* candidates, int candidatesSize, int target, int** columnSizes, int* returnSize) {
    //排序
    quickSort(candidates,0,candidatesSize-1);
    
    //累加和
    int *sum = malloc(sizeof(int));
    *sum = 0;
    //記錄下標(biāo)
    int *index = malloc(sizeof(int)); 
    *index = 0;
    //記錄數(shù)組
    int *result = malloc(sizeof(int) * target);
    //記錄個(gè)數(shù)
    int *count = malloc(sizeof(int));
    *count = 0;
    //定義數(shù)組容器
    int** tempArray = malloc(sizeof(int*) * 200);
    //定義長度容器
    int* tempColumnSizes = malloc(sizeof(int) * 200);
    //調(diào)用回溯算法
    combinationSumTool(candidates, candidatesSize, target, tempColumnSizes, 0, sum, index, result, count, tempArray);
    
    columnSizes[0] = malloc(sizeof(int) * *count);
    //如果只有一個(gè)結(jié)果吠冤,那肯定沒有重復(fù)的
    if (*count < 2) {
        *returnSize = *count;
        for (int i = 0; i < *count; i++) {
            columnSizes[0][i] = tempColumnSizes[i];
        }
        return tempArray;
    }
    //去重,就這里和上周不一樣
    int** returnArray = malloc(sizeof(int*)* *count);
    int len = 0;
    
    for (int i = 0; i < *count-1; i++) {
        //默認(rèn)不相同
        int isEqual = 0;
        for (int j = i+1; j < *count; j++) {
            //先比個(gè)數(shù)恭理,不一樣就直接比下一個(gè)
            if (tempColumnSizes[i] != tempColumnSizes[j]) continue;
            int num = tempColumnSizes[i];
            for (int k = 0; k < tempColumnSizes[i]; k++) {
                if (tempArray[i][k] != tempArray[j][k]) break;
                num--;
            }
            //如果相同拯辙,標(biāo)記退出
            if (!num) {
                isEqual = 1;
                break;
            }
        }
        if (!isEqual) {
            //將第i個(gè)記錄進(jìn)去
            columnSizes[0][len] = tempColumnSizes[i];
            returnArray[len] = malloc(sizeof(int) * tempColumnSizes[i]);
            for(int l = 0; l < tempColumnSizes[i]; l++) {
                returnArray[len][l] = tempArray[i][l];  
            }
            len++;
        }
    }
    columnSizes[0][len] = tempColumnSizes[*count-1];
    returnArray[len] = malloc(sizeof(int) * tempColumnSizes[*count-1]);
    for(int l = 0; l <= tempColumnSizes[*count-1]; l++) {
        returnArray[len][l] = tempArray[*count-1][l];
    }
    *returnSize = len+1;
    return returnArray;
}

效率一般,用C的人太少太少了。涯保。诉濒。

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品,歡迎轉(zhuǎn)載夕春,轉(zhuǎn)載時(shí)請(qǐng)注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末未荒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子及志,更是在濱河造成了極大的恐慌片排,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速侈,死亡現(xiàn)場離奇詭異率寡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锌畸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門勇劣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潭枣,你說我怎么就攤上這事比默。” “怎么了盆犁?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵命咐,是天一觀的道長。 經(jīng)常有香客問我谐岁,道長醋奠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任伊佃,我火速辦了婚禮窜司,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘航揉。我一直安慰自己塞祈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布帅涂。 她就那樣靜靜地躺著议薪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媳友。 梳的紋絲不亂的頭發(fā)上斯议,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音醇锚,去河邊找鬼哼御。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艇搀。 我是一名探鬼主播尿扯,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼焰雕!你這毒婦竟也來了衷笋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤矩屁,失蹤者是張志新(化名)和其女友劉穎辟宗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吝秕,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泊脐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烁峭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片容客。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖约郁,靈堂內(nèi)的尸體忽然破棺而出缩挑,到底是詐尸還是另有隱情,我是刑警寧澤鬓梅,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布供置,位于F島的核電站,受9級(jí)特大地震影響绽快,放射性物質(zhì)發(fā)生泄漏芥丧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一坊罢、第九天 我趴在偏房一處隱蔽的房頂上張望续担。 院中可真熱鬧,春花似錦活孩、人聲如沸物遇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挎挖。三九已至这敬,卻和暖如春航夺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崔涂。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工阳掐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓缭保,卻偏偏與公主長得像汛闸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子艺骂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本周題目難度級(jí)別'Medium'诸老,使用語言:C 題目:給你一個(gè)集合candidates和一個(gè)數(shù)字target,讓你...
    CrazySteven閱讀 634評(píng)論 0 0
  • 本周題目難度級(jí)別"Meidum"钳恕,使用語言C 題目:和上周一樣給你一組數(shù)讓你求出全排列别伏,不同的是,上周給你的一組數(shù)...
    CrazySteven閱讀 490評(píng)論 0 3
  • 本周的算法題難度級(jí)別“Medium”,用了我三天工作之余的時(shí)間忧额,總算過了厘肮,效率較低 題目:給你一串?dāng)?shù)字,在9宮格鍵...
    CrazySteven閱讀 1,181評(píng)論 0 3
  • 最近換了工作睦番,房子到期了又到處去看房子类茂,加上周末還要上課做作業(yè),感覺好累托嚣,精神總不容易集中巩检,導(dǎo)致本周的題目斷斷續(xù)續(xù)...
    CrazySteven閱讀 555評(píng)論 0 0
  • 本周題目難度級(jí)別"Medium",使用語言C 題目:本周題目又是造輪子注益,求x的n次方碴巾,即pow(x,n). 思路:...
    CrazySteven閱讀 425評(píng)論 3 5