LeetCode-第四十一题-困难

结果展示LeetCode-第四十一题-困难_第1张图片

先展示一下运行时间和内存占用,首先声明这里没有运用哈希表等高级数据结构,我们仅用了一个数组。

题目解析

当看到这个题的时候,我就想到了用一个数组,我记得这种方法是在天津大学的机试题上看到的。当时的记忆特别深刻·,这种方法是先将x数组的全部元素赋值为0,循环将nums中的数转化成x数组的下标,并将这个下标对应的数赋值为1。LeetCode-第四十一题-困难_第2张图片
大概意思就是以上的图解。

代码讲解

int firstMissingPositive(int* nums, int numsSize) {
    int* x = (int*)calloc(numsSize + 1, sizeof(int));
    
    for(int i = 0; i < numsSize; i++) {
        if(nums[i] > 0 && nums[i] <= numsSize) {
            x[nums[i]] = 1;
        }
    }
    
    for(int j = 1; j <= numsSize; j++) {
        if(x[j] == 0) {
            free(x);
            return j;
        }
    }
    
    free(x);
    return numsSize + 1;
}

这里我们只讲核心代码,第一步,先将x中的下标含nums中的数的下标赋1,第二步,从下标0开始判断,如果有0则直接输出。
想法很简单,不过有个问题,x的数组大小要取多少才能保证计算机的内存不被过多占用且时间复杂度要尽量高呢?
我开始用的molloc,不过最终用的colloc,这是为什么呢?因为colloc有个特点,colloc申请一个空间之后自动赋值为0,这样我们就不用用一个循环来赋初值0了,这样就节省了大量的时间复杂度。
那么问题又来了,我们应该申请多少空间呢?
这里我们只申请了numsSize个!为什么呢?因为只选择小于等于数组大小 numsSize 的元素。因为我们要找的是从1到 numsSize 的缺失的最小正整数,如果数组中存在大于 numsSize 的元素,那么缺失的最小正整数一定不会超过 numsSize。这样我们就不用老老实实申请一个50000*4个字节的空间。
大家还有没有更优化的算法,请与我交流喔!时间不早了,大家晚安!!

你可能感兴趣的:(leetcode,算法,数据结构)