leecode-面57(和为s的连续正数序列)

只愿长相守 提交于 2020-03-07 02:39:32

移动窗口法的衍生

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct Node_{
    int len;
    int *next;
}Node;

Node *node;
Node* Initial(int target){
    int n=sqrt(2*target);
    Node *node=(Node*)calloc(n,sizeof(Node));
    return node;
}

int * returnColum(int start,int end){//end<start
    int *arry=(int*)calloc(start-end+1,sizeof(int));
    int i=0;
    int len=start-end+1;
	for(int i=0;i<len;i++)
	{
		arry[i]=end++;
	}
    for(int i=0;i<2;i++)
    return arry;
}

Node* getcloum(int target,int *returnSize){
    int start=(target+1)/2;
    int end=start;
    int sum=0;
    int N=0;
    int m=0;
    while(end>0)
    {
        N=start-end+1;
        sum=N*end+(N-1)*N/2;
        if(sum==target)
        {
            (*returnSize)++;
            node[m].len=start-end+1;
            int *p=returnColum(start,end);
            node[m].next=p;
            m++;
            start--;
            end=end-2;
        }
        else if(sum<target) end--;
        else 
        {
            start--;
            end--;
        }
    }
    return node;
}

int main(){
    int target=40;
    int returnSize=0;
    node=Initial(target);
    getcloum(target,&returnSize);
    for(int i=returnSize;i>-1;i--)
    {
        int *p=node[i].next;
        for(int j=0;j<node[i].len;j++)
        {
            printf("%d ",*p);
            p++;
        }
        printf("\n");
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!