今天又见到一个滑动窗口的题目 记得之前在哪里见过,看来这个算法一定要好好练练
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9 输出:[[2,3,4],[4,5]] 示例 2:
输入:target = 15 输出:[[1,2,3,4,5],[4,5,6],[7,8]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){
int percolnum = target/2 +1;//这里是情况中序列最大数目
int** res =(int**)malloc(percolnum*sizeof(int *));
int* col = (int *)malloc(percolnum*sizeof(int));
int num = 0;
int j=1;
int sum = 0;
for(int i =1;i<percolnum;i++)//窗口最多滑动到percolnum-1位置
for(;j<=percolnum;j++)
{
if(sum+j==target)
{
sum+=j;
col[num] = j-i+1;
res[num]=(int *)malloc(col[num]*sizeof(int));
for(int m = 0;m<col[num];m++)
{
res[num][m] = i+m;
}
j++;
sum-=i;
num++;
break;
}
if(sum+j>target)
{
sum-=i;
break;
}
sum+=j;
}
*returnSize = num;
*returnColumnSizes = col;
return res;
}
其实这道题还有好几种算法!
官方还有一道解法是采用数学的方法
解方程
放个链接 自己看吧
数学解法
我自己呢!也想到了一种,
提供给大家参考 那就是找出这个数的所有因子,如15 是3 * 5, 1 * 15
3 * 5 可以看成3个5 即4 5 6 因为两边之和肯定是中间的两倍 。 当然因子也有可能含有偶数,这是同样道理
入20 = 5 * 4 表示 4个5 或5 个4 。表示成4个5 时 肯定是从 2,3 同时往两边扩充