《剑指offer》面试题41/42——和为s的两个数字VS和为s的连续正数序列(C++代码实现)

和为s的两个数字VS和为s的连续正数序列

1. 和为s的两个数字;

1)思路:

假设数组升序排列:
定义两个指针min 和max;
如果这两个指针指向的数字等于sum,则找到;
如果和小于sum,则将min向右移;
如果和大于sum,则将max向左移。

2)代码:

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

vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
    vector<int> res;
    res.clear();
    int length=array.size();
    int Min=0, Max=length-1;
    while(Min<Max)
    {
        if((array[Min]+array[Max])==sum)
            {
                res.push_back(array[Min]);
                res.push_back(array[Max]);
                break;
            }
        else if ((array[Min]+array[Max])<sum)
            Min++;
        else
            Max--;
    }

    return res;
}
int main()
{
 vector<int> array={1,2,4,7,11,15};

vector<int>res=FindNumbersWithSum( array, 15);
cout<<res[0]<<","<<res[1]<<endl;

    return 0;
}

运行结果:

4,11

Process returned 0 (0x0)   execution time : 0.080 s
Press any key to continue.

2. 和为s的连续正数序列

参考《剑指offer》的解题思路:

C++代码:

#include <iostream>
#include<vector>
using namespace std;
vector<int> StoreContinuousSequence(int small,int big);

void Print2Dvec(vector<vector<int>> vec)
{
    vector<int> curvec;
    for(int i=0;i<=vec.size()-1;i++)
    {
        curvec.clear();
        curvec=vec[i];
        for(int j=0;j<=curvec.size()-1;j++)
            cout<<curvec[j]<<" ";
        cout<<endl;
    }
    return;
}

vector<vector<int> > FindContinuousSequence(int sum)
{
    vector<vector<int>> answer;
    answer.clear();
    int small=1, big=2;
    int middle=(1+sum)/2;
    int curSum=small+big;
    while(small<middle)
    {
        if(curSum==sum)
            answer.push_back(StoreContinuousSequence(small,big));
        while(curSum>sum&&small<middle)
        {
            curSum-=small;
            small++;
            if(curSum==sum)
                answer.push_back(StoreContinuousSequence(small,big));
        }
        big++;
        curSum+=big;
    }
    return answer;
}
vector<int> StoreContinuousSequence(int small,int big)
{
    vector<int>res;
    res.clear();
    for(int i=small; i<=big;i++)
        res.push_back(i);
    return res;
}
int main()
{
    vector<vector<int> >vec= FindContinuousSequence(9);
    Print2Dvec(vec);
    return 0;
}

运行结果:

2 3 4
4 5

Process returned 0 (0x0)   execution time : 0.313 s
Press any key to continue.

猜你喜欢

转载自blog.csdn.net/zhenaoxi1077/article/details/81013205