最近的一对 C++ 代码实现

【题目描述】
给出包含n个元素的数组a,求a中距离最近的一对i,j,满足i<j且a[i]=a[j]。如果同时存在多对,输出最小的i对应的a[i]。
例如:10个数19,13,11,19,11,5,6,3,4,3满足存在a[i]=a[j]的数字包括: 19,11,3。其中11,3这两对的距离更近,在距离相同的情况下,11的下标更靠前。如果不存在相同的数字,输出"No"。

【输入】
第一行:1个数n表示数组的长度(2≤n≤100000)。
第2至n+1行:每行1个数,对应数组的元素(1≤a[i]≤10的9次方)。

【输出】
输出符合条件的i最小的a[i]。

【输入样例】
10
19
13
11
19
11
5
6
3
4
3
【输出样例】
11

#include <iostream>
#include <unordered_map>
#include <climits>
using namespace std;

int main() {
    int n;
    cin >> n;

    unordered_map<int, int> last_index; // 记录每个数上次出现的位置
    int min_distance = INT_MAX; // 初始化最小距离为最大值
    int result = -1; // 用于记录结果

    for (int i = 0; i < n; i++) {
        int a;
        cin >> a;

        if (last_index.find(a) != last_index.end()) {
            // 如果a已经出现过,计算当前距离
            int distance = i - last_index[a];

            // 检查是否需要更新最小距离和结果
            if (distance < min_distance) {
                min_distance = distance;
                result = a;
            }
        }

        // 更新a的最近出现位置
        last_index[a] = i;
    }

    if (result == -1) {
        cout << "No" << endl;
    } else {
        cout << result << endl;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值