剑指offer——和为s的两个数字VS和为s的连续正数序列

两种方法都类似于快排的变形。

#include <iostream>
#include <string>
using namespace std;

bool FindNumbersWithSum(int data[],int length,int sum,int *num1,int *num2)
{
    bool found=false;
    if (length<1||num1==NULL||num2==NULL)
    {
        return found;
    }
    int ahead=length-1;
    int behind=0;
    while(ahead>behind)
    {
        long curSum=data[ahead]+data[behind];
        if (curSum==sum)
        {
            *num1=data[behind];
            *num2=data[ahead];
            found=true;
            break;
        }
        else if(curSum>sum)
        {
            ahead--;
        }
        else
        {
            behind++;
        }
    }
    return found;
}

void PrintContinuousSequence(int small,int big)
{
    for (int i=small;i<=big;i++)
    {
        cout<<i<<" ";
    }
    cout<<endl;
}

void FindContinuousSequence(int sum)
{
    if (sum<3)
    {
        return;
    }
    int small=1;
    int big=2;
    int middle=(1+sum)/2;
    int curSum=small+big;
    while(small<middle)
    {
        if (curSum==sum)
        {
            PrintContinuousSequence(small,big);
        }
        while(curSum>sum&&small<middle)
        {
            curSum-=small;
            small++;
            if (curSum==sum)
            {
                PrintContinuousSequence(small,big);
            }
        }
        big++;
        curSum+=big;
    }
}



int main()
{
    int str[]={1,2,3,4,5,6,7,8,9,10};
    int m,n;
    FindNumbersWithSum(str,10,13,&m,&n);
    cout<<m<<n<<endl;
    FindContinuousSequence(100);
    return 0;
}
posted @ 2014-09-06 22:16  啵啵那个臭  阅读(150)  评论(0编辑  收藏  举报