<span style="font-size:18px;">/*
题目:
给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。
比如 [1,2,0] 返回 3, [3,4,-1,1] 返回 2。最好能 O(1) 空间和 O(n) 时间。
*/
#include<stdio.h>
#include<stdlib.h>
//思路:
/*
数组A[n]长度为n。
因为要求寻找的数必须大于0.
所以假定有一列数 [1...n]
那么A[n]中的数和[1...n]有如下几种关系
逐一查找,看[1...n]中的数在A[n]中是否都存在。
1.[1...n]里的元素,A[n]中都有,那么这两组数重合了,因此,既>0,又不属于A[n]的数,为n+1;
2.若不重合,[1...n]中哪个元素先没有的,答案就是此数。
但是二分查找需要有序表。得先排序
二分查找的话,查找n个元素需要O(nlogn)
*/
//二分查找函数
bool binserch(int x, int *a, int n)
{
int low=0;//保留域的左下标
int high=n-1;//保留域的右下标
int mid;//保留域的中间下标
while (low<=high)
{
mid=(high+low)/2;
if(x>a[mid])
{
low=mid+1;
}
else if(x<a[mid])
{
high=mid-1;
}
else
{
return true;
}
}
return false;
}
//堆排序函数
void adjustHeap(int *A,int len,int i)
{
int l,r,large,temp;
l=2*i+1;
r=2*i+2;
large=i;
if(l<len)
{
if(A[l]>A[i])
{
large=l;
}
}
if(r<len)
{
if(A[r]>A[large])
{
large=r;
}
}
if(large!=i)
{
temp=A[large];
A[large]=A[i];
A[i]=temp;
adjustHeap(A,len,large);
}
}
void buildHeap(int *A,int len)
{
int i;
for(i=len/2-1;i>=0;i--)
adjustHeap(A,len,i);
}
void HeapSort(int *A,int len)
{
int i,temp;
buildHeap(A,len);
for(i=len;i>1;i--)
{
temp=A[0];
A[0]=A[i-1];
A[i-1]=temp;
buildHeap(A,i-1);
}
printf("\n");
}
void lookFTLose(int *a,int array_len)
{
int i;//计数器
for(i=1;i<=array_len;i++)
{
if(!binserch(i,a,array_len))
{
printf("%d\n",i);
return;
}
}
printf("%d\n",array_len+1);
}
//main函数
int main()
{
int i;//计数器
int n;//数组大小
int *a;//待处理数据
int res;//存储结果;
while(scanf("%d",&n)!=EOF)
{
a=(int *)malloc(n*sizeof(int));//为动态数组a分配空间
//输入数据
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
HeapSort(a,n);
lookFTLose(a,n);
}
}
</span>
算法题目:寻找迷失的数字。
最新推荐文章于 2023-04-15 01:48:20 发布