和为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.