在双指针算法的情况下是用哈希表

本文介绍了一种使用C++中的哈希表优化查找两个整数数组中满足特定条件的元素对的方法,通过先将一个数组的元素存储在哈希表中,然后遍历另一个数组,达到O(m+n)的时间复杂度,目标是接近于O(max(m,n))的一半性能。
摘要由CSDN通过智能技术生成

#include<iostream>
#include <map>
#include <vector>


//用哈希表来记录
using namespace std;
const int N = 100010;
typedef pair<int, int> PII;  //存储符合要求 <i , j>对

vector< PII > result;

int a[N];
int b[N];


int main()
{
    int n,m,x;
    cin >> n>>m>>x;
    map<int , int> my_map;

    for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);  //因为哈希表没有找到值默认返回的是0  预计O(max(m , n))
    for (int i = 1; i <= m; i ++ ) scanf("%d", &b[i]);
    //可以先用哈希表把A的元素存进去然后拿B的值一个一个比  时间复杂度是0(m + n)
    //目标是调高到预计O(max(m , n))一半左右
    int j = 1;
    for (int i = 1; i <= n; i ++ ) 
    {
        if(my_map.find(x - a[i]) != my_map.end())  //说明已经有b存储进去了
        {
           
            result.push_back(make_pair(i-1 , my_map[x - a[i]] - 1) );
        }
        
        my_map[x - a[i]] = i;  //更新哈希表 将A数组的值加入进去  因为同一数组的值不一样 但是不同数组之间可能存在一样的
                               //而后产生相对的可能性 (1 ,2 ,3) (3 , 2) x = 5
        
        while (j <= i && j <= m)  
        {
            if(my_map.find(b[j]) != my_map.end())  // a中存在于和b[j]满足条件的
            {
                result.push_back(make_pair(my_map[b[j]] - 1 ,j - 1));
                
            }else{                 //如果不存在那么就将B[j]的值增加进去
                  
                 my_map[b[j]] = j;
                  
            }
            j++;
           
        }
    }
    
    if(j <= m)
    {
        for (; j <= m; j ++ )
        {
            if(my_map.find(b[j]) != my_map.end())
                result.push_back(make_pair(my_map[b[j]] ,j));
        }
    }

    for (int i = 0; i < result.size() ; i++ )
    {
        cout << result[i].first<<" "<<result[i].second<<endl;
    }

    
    
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值