我的思路:两次for用公式求解
思路2:滑动窗口
从左边界为1,右边界为2开始滑动,如果sum<target,右边界+1,如果加完之后还小于,继续加,一直加,加到
(1)如果=target,就记录下该序列,并且左边界+1
(2)>target,就说明从左边界开始的序列不可能满足,所以左边界+1
//returnsize=行,returncolumnsize=一维数组(需自己申请)
int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){
int mid=target/2;
int left=1;
int right=2;//左右边界
int m;
int p=0;//列数
int q=0;//行数
int s=0;//每行的列数
int sum=left+right;
int**ret=(int**)malloc(sizeof(int*)*mid);
int*col=(int*)malloc(sizeof(int)*mid);
while(left<=mid)
{
if(sum<target)
{
sum+=++right;
}
if(sum>target)
{
sum-=left++;
}
if(sum==target)
{
m=right-left+1;//每行列数
ret[p]=malloc(sizeof(int)*m);//为二维数组的一维数组申请空间时,无需int*强转
col[p]=m;
for(int b=left;b<=right;b++)
{
ret[p][s++]=b;
}
p++;
left++;
}
*returnSize=p;
*returnColumnSizes=col;
return ret;
}
遇到二维数组要做的事:
(1)申请二维数组
(2)申请存放每行的列的个数的一维数组
(3)为一维数组赋值
(4)申请二维数组中的一维数组(即ret[i])
(5)*returnsize=行(一个数)
*returncolumnsize=col(一个数组)
return ret