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 }
面试的题看起来简单,实则技巧性太强了。