类似 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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复