首页 > 试题广场 >

缺失的第一个正整数

[编程题]缺失的第一个正整数
  • 热度指数:76715 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数

进阶: 空间复杂度 ,时间复杂度

数据范围:
-2^{31}\le nums[i] \le 2^{31}-1
0\le len(nums)\le5*10^5
示例1

输入

[1,0,2]

输出

3
示例2

输入

[-2,3,4,1,5]

输出

2
示例3

输入

[4,5,6,8,9]

输出

1
int minNumberDisappeared(int* nums, int numsLen ) {
    int HashTable[500000] = {0}, i;
    for (i = 0; i < numsLen; i++) {
        if(nums[i]<=sizeof(HashTable))
        HashTable[nums[i]-1] = 1;
    }
    for (i = 0; i < sizeof(HashTable); i++) {
        if(HashTable[i] == 0)
            return i+1;
    }
    return sizeof(HashTable)+1;
}

发表于 2024-03-20 21:58:39 回复(0)
int minNumberDisappeared(int* nums, int numsLen ) {
    // write code here
    for (int i = 0; i < numsLen; i++) {
        while (nums[i] > 0 && nums[i] <= numsLen && nums[nums[i] - 1] != nums[i]) {
            int temp = nums[nums[i] - 1];
            nums[nums[i] - 1] = nums[i];
            nums[i] = temp;
        }
    }
   
    // 找到第一个不在正确位置上的数字,即为最小的不存在的正整数
    for (int i = 0; i < numsLen; i++) {
        if (nums[i] != i + 1) {
            return i + 1;
        }
    }
   
    // 如果数组中没有缺失的正整数,则返回数组长度加一
    return numsLen + 1;
}
发表于 2023-11-07 13:39:18 回复(0)
int minNumberDisappeared(int* nums, int numsLen ) {
    // write code here

    //缺失的第一个正整数只可能在1~500001中取
    int a[500001];
    int i;

    //遍历nums并在a中记录
    for (i = 0; i < numsLen; i++){  
        if (nums[i] > 0 && nums[i] <=500000) a[nums[i]]++;
    }
    //找到第一个出现次数为0的下标
    for (i = 1; i < 500001; i++){
        if (a[i] == 0) return i;
    }
    //前500000个数字没有,那么只可能是500001了
    return 500001;
}

发表于 2023-03-17 19:30:40 回复(1)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int minNumberDisappeared(int* nums, int numsLen ) {
    // write code here
    
    int map[500001] = {0};
    for(int i = 0;i<numsLen;i++){
        if(nums[i] >0){
            map[nums[i]] = 1;
        }
    }
    
    for(int i = 1;i<500001;i++){
        if(map[i] == 0){
            return i;
        }
    }
    
    return 0;
}
发表于 2022-04-24 23:37:34 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 */
int minNumberDisappeared(int* nums, int numsLen ) {
    // write code here
    int i,max=-111111;
    int c[500001]={0};
    for(i=0;i<numsLen;i++)
    {
        if(nums[i]>=1) c[nums[i]]++;
        if(nums[i]>max) max=nums[i];
    }
    for(i=1;i<=max;i++)
    {
        if(c[i]==0) return i;
    }
    return max+1;
}

发表于 2021-11-05 19:57:17 回复(0)

问题信息

上传者:牛客301499号
难度:
5条回答 4254浏览

热门推荐

通过挑战的用户

查看代码