zoukankan      html  css  js  c++  java
  • 数组中未出现的最小正整数(算法)

     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 }

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

  • 相关阅读:
    解决genemotion模拟器冲突导致的Android Studio无法启动ADB的问题
    Google Chrome Resize Plugin
    IntelliJ IDEA + Maven创建Java Web项目
    iOS开发
    Java对象和XML的相互转换化
    使用SpringMVC的@Validated注解验证的实现
    Spring @Validated 使用
    @validated注解实现
    springmvc的@Validated注解使用
    C#调用C++编写的DLL
  • 原文地址:https://www.cnblogs.com/WDKER/p/5473201.html
Copyright © 2011-2022 走看看