AcWing 3761. 唯一最小数

问题描述

给定一个长度为 n 的整数数组 a 1 , a 2 , … , a n a1,a2,…,an a1,a2,,an

请你找到数组中只出现过一次的数当中最小的那个数。

输出找到的数的索引编号。

a 1 a1 a1的索引编号为 1 1 1 a 2 a2 a2的索引编号为 2 2 2,…, a n an an的索引编号为 n n n

输入格式:

第一行包含整数 T T T,表示共有 T T T组测试数据。

每组数据第一行包含整数 n n n

第二行包含 n n n 个整数 a 1 , a 2 , … , a n a1,a2,…,an a1,a2,,an

输出格式:

每组数据输出一行结果,即满足条件的数的索引编号,如果不存在满足条件的数,则输出 − 1 −1 1

数据范围

1 ≤ T ≤ 2 × 104 , 1≤T≤2×104, 1T2×104,
1 ≤ n ≤ 2 × 105 , 1≤n≤2×105, 1n2×105,
1 ≤ a i ≤ n , 1≤ai≤n, 1ain,
同一测试点内的所有 n n n的和不超过 2 × 1 0 5 2×10^5 2×105

输入样例:

6
2
1 1
3
2 1 3
4
2 2 2 3
1
1
5
2 3 2 4 2
6
1 1 5 5 4 4

输出样例:

-1
2
4
1
2
-1

思路

原题链接

C++代码:

#include <iostream>
#include <cstring>

using namespace std;

const int N = 2e5 + 10;

int n;
int w[N], cnt[N];

int main()
{
    int T;
    scanf("%d", &T);
    
    while (T -- )
    {
        scanf("%d", &n);
        //每组数据使用前都要清空cnt中记录的数字的次数
        memset(cnt, 0, (n + 1) * 4);
        
        //用cnt数组来记录每个数字出现多少次
        //用w数组来记录每个数字下下标
        for (int i = 0; i < n; i ++ )
        {
            scanf("%d", &w[i]);
            cnt[w[i]] ++ ;
        }
        
        int res = -1;//直接置为-1 假设不存在此种情况
        
        //扫描一遍cnt数组,找出只出现一次的数字进行判断,然后找出最小的出现一次的数字,输出下标。
        for (int i = 0; i < n; i ++ )
        {
            if (cnt[w[i]] == 1) //只对该数字 只出现一次的进行判断
            {
                if (res == - 1 || w[res] > w[i])
                    res = i; // 找出最小的数字 在w数组中 i即为下标
            }
        }
        if (res != - 1) res ++; //位置偏移1
        printf("%d\n", res);
    }
    
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值