[模拟] 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. 唯一最小数(哈希+模拟)的主要内容,如果未能解决你的问题,请参考以下文章

2021暑假每日一题 week1 完结

[构造] aw3764. 三元数异或(贪心+模拟)

[模拟] aw3770. 最小消耗(模拟+aw周赛008_1)

[模拟] aw3733. 去掉一个元素(模拟+aw周赛006_1)

[构造] aw3732. 矩阵复原(模拟+构造)

[构造] aw3767. 最小的值(贪心+模拟)