算法题目:寻找迷失的数字。

来源:互联网 发布:其孰能讥之乎的其 编辑:程序博客网 时间:2024/06/06 13:08
<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>


0 0