• 寻找一个数组中未出现的最小正整数(数组元素可重复)


    题目描述

    Description

    Given nn non-negative integers, please find the least non-negative integer that doesn’t occur in the nn numbers.

    Input

    The first line is an integer T, representing the number of test cases.(T≤10)
    The first line of each test case is an integer n (n≤2∗10​^5​​).
    The second line of each test case are nn non-negative integers ai​​ (ai​​<2​^31​​).

    Output

    For each test case, output a line with the answer.

    输入样例

    2

    4

    4 0 1 3

    2

    1 1

    输出样例

    2

    0

     

    分析:暴力数字范围给定,暴力搜索其实也不是不可以,但是肯定会超时,网上有很多解法针对的都是数组元素不重复的情况,参考价值也不是很大,后来我自己想了一种方法,需要先进行排序,之后从头遍历,需要记录下来重复数字的重复次数,根据数组下标和重复次数之间的 关系,得到解答。时间复杂度O(n),空间复杂度O(1)

    代码:

     1 #include<algorithm>
     2 #include<iostream>
     3 #include<string>
     4 #include<vector>
     5 using namespace std;
     6 int main()
     7 {
     8     int n;
     9     cin >> n;
    10     // 打比赛时使用GCC编译器,务必要将两个>之间打上空格,以免误判
    11     vector<vector<int> > v(1001,vector<int>(200001,INT_MAX));
    12     vector<int> len(1001);
    13     for (int i = 0; i < n; i++)
    14     {
    15         //int m;
    16         cin >> len[i];
    17         for (int j = 0; j < len[i]; j++)
    18             cin >> v[i][j];
    19     }
    20     for (int i = 0; i < n; i++)
    21     {
    22         int res = 0;
    23         int repNum = 0;
    24         sort(v[i].begin(), v[i].end());
    25         if (v[i][0] > 0)
    26         {
    27             cout << 0 << endl;
    28             continue;
    29         }
    30         else
    31         {
    32             int j = 1;
    33             for ( ; j < len[i]; j++)
    34             {
    35                 if (v[i][j] == v[i][j - 1])
    36                 {
    37                     repNum++;
    38                     continue;
    39                 }
    40                 if (v[i][j] != j - repNum)
    41                 {
    42                     cout << j - repNum << endl;
    43                     break;
    44                 }
    45             }
    46             if (j == len[i])
    47                 cout << len[i] << endl;
    48         }
    49     }
    50     system("pause");
    51     return 0;

     

  • 相关阅读:
    sql总结:
    VS2008生成DLL文件的方法、引用dll文件以及意义
    Mysql日期和时间函数
    删除文件后硬盘可用空间为何不增加?
    C# CheckedListBox控件的用法
    SNMP监控一些常用OID的总结
    解决 MariaDB无密码就可以登录的问题
    Cisco路由器用SSH替代Telnet连接
    思科、华为、H3C常用命令对比大全
    转载:关于思科交换机、路由器如何关闭telnet 开启ssh服务
  • 原文地址:https://www.cnblogs.com/dapeng-bupt/p/8746792.html
Copyright © 2020-2023  润新知