最近的一对
题目描述
给出包含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)
输出格式
输出符合条件的最小的a[i]。
样例
【样例输入】
10
19
13
11
19
11
5
6
3
4
3
【样例输出】
11
【样例说明】
满足存在a[i]=a[j]的数字包括:19,11,3。
其中11,3这两对的距离更近,在距离相同的情况下,11的下标更靠前。
数据范围与提示
2 <= n <= 100000 1<= a[i] <= 10^9
一些想法
这题用 map 做,先定义一个 map,这个 map 将用于记录每个数字最后一次出现的位置,定义一个用于记录当前距离最近的两个数,和一个用于记录这个数是多少的两个变量。然后输入有多少个数,循环输入这 n 个数,判断如果 a[x] 为真,说明他在之前有相同的数字出现过并且这个数与这个数字最后一次出现的距离比当前最短还短,更新最短值,记录这个数是多少。在 if 外面,a[x]=i; 标记某个数字最后一次出现的位置在 i。再循环外面判断,如果最小值与初始时的值一样,没有变化,说明没有两个相同的数字,输出 No,否则输出这个数。
注:最小值因为在后面要用于比较是否变化,我们要把他的初始值设在数据范围外,以防刚好而导致输出错误答案,可以设为 1e9或 1000000001,会超出 int 范围,所以要用 long long 类型。
注意大小写!map 的值和键可以都用 int。
AC代码
#include<bits/stdc++.h>
using namespace std;
map<int,int> a;
long long b=1000000001,sum;
int main(){int n;cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;if(a[x]&&i-a[x]<b) b=i-a[x],sum=x;a[x]=i;}if(b!=1000000001) cout<<sum;else cout<<"No";return 0;
}