类似 array1=[2,2,2,2],array2=[2,3,3],array3[3.5],变成array4=[[2,2,2,2],[2,3,3],[3,5]]


#include <stdio.h>

#include <stdlib.h>


int** combinationSum( int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes )

{

    int** retval = malloc( 150*sizeof(int*) ); // 对于给定的输入,保证和为 target 的唯一组合数少于 150 个

    *returnColumnSizes = malloc( 150*sizeof(int) );

    *returnSize = 0;


    int buf[30*200+1]; // 1<=candidates.length<=30, 1<=candidates[i]<=200, 1<=target<=500

    int bufSize = 0;

    int sum = 0;


    while( 1 )

    {

        //for( int i=0; i!=bufSize; ++i )

        //    printf( "%d%c", candidates[buf[i]], " \n"[i+1==bufSize] );


        if( sum == target )

        {

            (*returnColumnSizes)[*returnSize] = bufSize;

            retval[*returnSize] = malloc( bufSize*sizeof(int) );

            for( int i=0; i!=bufSize; ++i )

                retval[*returnSize][i] = candidates[buf[i]];

            ++*returnSize;

        }

        

        if( sum < target )

        {

            int last = bufSize==0 ? 0 : buf[bufSize-1];

            buf[bufSize++] = last;

            sum += candidates[last];

        }

        else

        {

            for( ; bufSize!=0 && buf[bufSize-1]==candidatesSize-1; --bufSize )

                sum -= candidates[candidatesSize-1];

            if( bufSize == 0 )

                break;


            sum += -candidates[buf[bufSize-1]] + candidates[buf[bufSize-1]+1];

            ++buf[bufSize-1];

        }

    }


    return retval;

}


int main( void )

{

    int candidates[] = { 2,3,6,7 };

    int candidatesSize = sizeof(candidates)/sizeof(*candidates);

    int target = 7;


    int returnSize;

    int* returnColumnSizes;

    int** retval = combinationSum( candidates, candidatesSize, target, &returnSize, &returnColumnSizes );

    for( int i=0; i!=returnSize; ++i )

    {

        for( int j=0; j!=returnColumnSizes[i]; ++j )

            printf( "%d%c", retval[i][j], ",\n"[j+1==returnColumnSizes[i]] );

    }

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论