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\n " ,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位置不相等时,相互交换直到满足。
时间复杂度为nlog n的时间复杂度
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\n " ,c);
25 }
26 return 0 ;
27 }
面试的题看起来简单,实则技巧性太强了。
查看更多关于数组中未出现的最小正整数(算法)的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did238200