数组中未出现的最小正整数|数据结构常见小题04

欢迎大家对于不对的地方进行批评指正,也可以在评论区分享自己遇到的算法题目,小编看到的话就会进行回复!

问题描述:

发现长度为n(n>=1)的整数数组中,未出现过的最小正整数

算法思想:

算法一:

先对系列进行排序,然后找到最小的正整数,
如果不是1,则return 1;
如果是1,则向后+1扫描,直到发现不匹配项,返回结果
时间复杂度为O(n*n),空间复杂度为O(1)

int findMinMiss_1(int a[],int n){
    int temp;
    //冒泡排序
    for(int i = 0; i<n; i++){
        for(int j = i; j < n-i-1; j++){
            if(a[j] > a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    //扫描最小正整数
    int minmiss = 1;
    for(int i = 0; i<n; i++){
        if(a[i] > 0){
            if(a[i] != 1){
                return 1;
            }
            else{
                for(; i<n;){
                    if(a[++i] != ++minmiss){
                        return minmiss;
                    }
                }
            }
        }
    }
    //可能全为负整数
    return 1;
}

算法二:

用空间换取时间,定义b[n],实现对0~n之间数字的标记
然后扫描数组b,找到最小未被标记的元素
时间复杂度为O(n),空间复杂度为O(n)

int findMinMiss_2(int a[], int n){
    int b[n] = {0};
    //出现过的元素在b中标记为1
    for(int i = 0; i<n; i++){
        if(a[i]>0 && a[i]<=n){
            b[a[i]-1] = 1;
        }
    }
    //扫描b中最小为0的元素
    for(int i = 0; i<n; i++){
        if(b[i] == 0){
            return i+1;
        }
    }
}

测试代码

int main(){
    int s[6] = {1,-8,2,-4,3,-6};
    int minmiss;
    //minmiss = findMinMiss_1(s, 6);
    minmiss = findMinMiss_2(s, 6);
    cout <<"MinMiss=" <<minmiss <<endl;
    return 0;
}

结果:
MinMiss=4


小结

两种算法中时间空间各有侧重,条件允许时用空间换时间,或者用时间换取空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值