目的:使用自行设计的顺序表ADT或STL的vector模板设计并实现顺序表应用场合的一些简单算法设计。
应用8:假设有一个整数类型的顺序表(假定为非空表),元素取值可能是1~N(10<=N<=100000)中的任意一个数,相同数值不会重复出现。试设计一个算法,用O(n)的时间复杂度将找出顺序表中符合条件的数对的个数,满足数对中两数的和等于N+1。
(1)顺序表ADT版本
参考函数原型:
template<class ElemType>
int getCount(SqList<ElemType> &A, int N);
(2)vector版本
参考函数原型:
template<class ElemType>
int getCount(vector<ElemType> &A, int N);
函数形参:
A: 整数类型的顺序表,其元素取值可能是1~N(10<=N<=100000)中的任意一个数
N: 在A中,查找两个数的和等于N+1的对数
函数返回值:
返回统计结果
输入说明 :
第一行:整数N,表示给定的N值。
第二行:顺序表的数据元素(取值可为1~N中的任意一个数),以空格分隔
输出说明 :
第一行:顺序表A的遍历结果,以“,”分隔。
空行
第二行:统计结果
题解:
看了这位大佬的博客很快就找到了思路:http://t.csdn.cn/FPwqs
其实就是模仿哈希表 另造一个vector数组用来标记原数组中有的元素 因为查询下标的时间复杂度是O(1)所以不用担心超时
现在的问题是我的代码一共就60行 感觉怎么切割都有被判抄袭的风险啊。。
所以我决定用截图来展示关键函数✌
完整代码考试结束发
#include <iostream>
#include <vector>
#include <map>
using namespace std;
#define MAXSIZE 100;
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
template<class ElemType>
class Sqlist {
private:
vector <int> elem;
int length;
public:
Sqlist()
{
length = 0; int num = 0;
while (cin >> num) {
elem.push_back(num);
length++;
}
}
int search(int num)
{
vector <int> A(elem);
vector <int> S(num+1, 0);
int sum = 0;
typename std::vector<ElemType>::iterator iter = A.begin();
while (iter != A.end()){
S[ * iter] = 1;
iter++;
}
iter = A.begin();
while (iter != A.end()){
int n = num + 1 - *iter;
S[*iter] = 0;
if (S[n] == 1) {
S[n] = 0;
sum++;
}
iter++;
}
return sum;
}
void traverse()
{
typename std::vector<ElemType>::iterator iter = elem.begin();
while (iter != elem.end()) {
cout << *iter;
if ((iter + 1) != elem.end()) cout << ",";
iter++;
}
}
};
int main()
{
int n, num = 0;
cin >> n;
Sqlist <int> S;
S.traverse();
cout << endl << endl;
num=S.search(n);
cout << num;
return 0;
}