您的位置:首页 > 其它

一种类似快速排序的移动算法

2012-11-29 20:49 190 查看
1.问题描述:

输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。

2.解题思路:

从向量的两端开始移动,如果两端之和等于输入的整数,则找到解,如果两端之和小于输入的整数,移动低端指针,否则移动高端指针

例如 2 3 6 8 9 10 11 22 ,输入整数17,则输出 8 9

 

3.代码

/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和
*正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,
*输出任意一对即可。
*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2012/11/29
*/

#include <iostream>
#include <vector>

using namespace std;

/*
*从向量的两端开始移动,如果两端之和等于输入的整数,则找到解
*如果两端之和小于输入的整数,移动低端指针,否则移动高端指针
*/
void Solution(vector<int>&v,int &num) {
vector<int>::iterator start=v.begin();
vector<int>::iterator finish=v.end()-1;
while(start!=finish) {
if(*start+*finish==num) {
cout<<*start<<"+"<<*finish<<"="<<num<<endl;
return;
}
else if(*start+*finish<num) start++;
else finish--;
}
}

void main() {
const int n=10;
int i;
int e;
vector<int>v;
for(i=0;i<n;i++) {
cout<<"请输入第"<<i<<"个数:";
cin>>e;
v.push_back(e);
}
int num;
cout<<"请输入一个整数:";
cin>>num;
Solution(v,num);
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: