dhu 顺序表ADT模板设计及简单应用:找匹配

28 篇文章 5 订阅
该博客介绍了如何使用顺序表ADT和STL的vector模板,设计一个在O(n)时间复杂度内找出整数顺序表中和为N+1的数对个数的算法。博主通过创建一个辅助vector数组来模拟哈希表,实现了快速查找和统计,避免了超时问题。代码简洁高效,共60行,但担心在某些场景下可能引发抄袭风险。
摘要由CSDN通过智能技术生成

目的:使用自行设计的顺序表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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值