[模拟] aw3761. 唯一最小数(哈希+模拟)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模拟] aw3761. 唯一最小数(哈希+模拟)相关的知识,希望对你有一定的参考价值。
1. 题目来源
链接:3761. 唯一最小数
2. 题目解析
模拟水题。
多组测试数据,不要 memset
整个数组就行了。其余的就是简单的模拟了。
注意一下代码实现技巧即可。本题需要输出对应的下标,那么这个下标就是输入顺序…就行了,不需要单独存!
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n;
int q[N], idx[N];
void solve() {
int n;
cin >> n;
memset(q, 0, sizeof(int) * (n + 5)); // 会用到 a[n] 这个下标
for (int i = 0; i < n; i ++ ) {
int x;
cin >> x;
q[x] ++ ;
idx[x] = i + 1;
}
for (int i = 1; i <= n; i ++ ) // 不要循环到 N
if (q[i] == 1) {
cout << idx[i] << endl;
return ;
}
cout << -1 << endl;
}
int main() {
int T; cin >> T; while (T -- ) {
solve();
}
return 0;
}
更为简洁的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n;
int w[N], cnt[N];
int main() {
int T; cin >> T; while (T -- ) {
cin >> n;
memset(cnt, 0, sizeof(int) * (n + 1));
for (int i = 0; i < n; i ++ ) cin >> w[i], cnt[w[i]] ++ ;
int res = -1;
for (int i = 0; i < n; i ++ ) {
if (cnt[w[i]] == 1) {
if (res == -1 || w[res] > w[i]) // 直接按照下标比较,线性扫描即可
res = i;
}
}
if (res != -1) res ++ ;
cout << res << endl;
}
return 0;
}
以上是关于[模拟] aw3761. 唯一最小数(哈希+模拟)的主要内容,如果未能解决你的问题,请参考以下文章
[模拟] aw3770. 最小消耗(模拟+aw周赛008_1)