算法100讲1-2 滑动窗口思路+二维指针注意事项

 

我的思路:两次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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值