• 数组中未出现的最小正整数(算法)


     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 int s[100];
     5 int main()
     6 {
     7     int l,r;
     8     int n;
     9     while(scanf("%d",&n),n)
    10     {
    11         for(int i=0;i<n;i++)
    12             scanf("%d",s+i);
    13         l=0;
    14         r=n;
    15         while(l<r)
    16         {
    17             if(s[l]==l+1)
    18                 l++;
    19             else if(s[l]<l+1||s[l]>r||s[s[l]-1]==s[l])
    20                 s[l]=s[--r];
    21                 else
    22                 swap(s[l],s[s[l]-1]);
    23         }
    24         printf("%d
    ",l+1);
    25     }
    26     return 0;
    27 }


    题目:

    给定一个无序数组arr,找到数组中未出现的最小正整数。
    要求:时间复杂度O(n),额外空间复杂度O(1);


    变量的解释
    l:表示从1-l已经存在的数
    r:表示1-r想要得到的数

    初始值:
    l=0
    r=n

    走的过程

    1>当l的位置值等于l+1,表示得到想要的
    2>当l的位置值<l时,表示l位置的值已经存在,所以这个数组不会存在到r的值了 so r--
    3>当l的位置值>r时,表示l的位置已经超过r,所以数组不会存在到r的值了, so r--
    4>当l的位置值和l值的位置-1的的位置值相等时,所以数组不会存在到r的值了,so r--
    5>当l的位置值>l&&<r&&l的位置值和l的位置-1位置不相等时,相互交换直到满足。

    时间复杂度为nlogn的时间复杂度

     1 #include<cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 int main()
     5 {
     6     int s[100];
     7     int n,c;
     8     while(scanf("%d",&n),n)
     9     {
    10         c=1;
    11         for(int i=0;i<n;i++)
    12             scanf("%d",s+i);
    13         sort(s,s+n);
    14         for(int i=0;i<n;i++)
    15         {
    16             if(s[i]==c)
    17                 c++;
    18             else
    19             {
    20                 if(s[i]>c)
    21                     break;
    22             }
    23         }
    24         printf("%d
    ",c);
    25     }
    26     return 0;
    27 }

    面试的题看起来简单,实则技巧性太强了。

  • 相关阅读:
    分布式缓存
    分布式事务
    数据库系列-分库分表
    消息队列系列-简介
    JAVA系列-引用
    生产环境CPU占用过高分析
    技术书单(部分)
    GitHub的强大搜索功能简介
    VS2019 community版本下载Extension太慢解决方案
    Python2同时输出中文和变量时中文乱码
  • 原文地址:https://www.cnblogs.com/WDKER/p/5473201.html
Copyright © 2020-2023  润新知