nowcoder NC30 缺失的第一个正整数

简介: 题目链接: https://www.nowcoder.com/share/jump/819478881694767416272

题目描述:


给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数

进阶空间复杂度 O(1),时间复杂度 O(n)

示例1

输入:[1,0,2]

返回值:3

示例2

输入:[-2,3,4,1,5]

返回值:2

示例3

输入:[4,5,6,8,9]

返回值:1

分析:

当看完题目和所给的三个例子后我们可以得出以下结论:

    1. 所给数组中的数据是随机的整数且是无序的;
    2. 所给数组中的数据有负数;
    3. 返回值必须不小于 1 。


    题目要求的空间复杂度 O(1),时间复杂度 O(n),那么我们就应该尽量减少空间的开辟。

    本题可以使用哈希表但是这样空间复杂度就是O(n)了所以这个方法应该是实在想不出解法了再使用。

    那么此时我们就可以上面得出的结论入手,既然数组是无序的那么我们就可以先使用库方法将其进行排序。

    publicintminNumberDisappeared (int[] nums) {
    Arrays.sort(nums);        
        }

    image.gif

    当排好序之后我们的思路一下就打开了,此时由于数组内可能会有不大于 0 的数出现所以我们可以先用一个循环来跳过这部分

    publicintminNumberDisappeared (int[] nums) {
    intret=0; //返回值intlen=nums.length; //数组长度Arrays.sort(nums);
    inti=0; //记录数组遍历的位置while (i<len&&nums[i] <=0) {
    i++;
            }
        }

    image.gif

    此时数组就剩下不小于 0 的数了,此时再进行判断就非常简单了,我们就可以直接判断两个数之间是否存在整数如果存在就返回这个整数。如果数组是 [1,2,3,4] 这样的那么我们就返回最后一个数加一。

    while (i<len-1) {
    if (nums[i] +1<nums[i+1]) {
    returnnums[i] +1;
                }
    i++;
            }
    ret=nums[len-1] +1;
    returnret;

    image.gif

    最后就到了每次做题都必不可少的环节了:极限值判断

    再代码的最前面对数组进行判断:如果数组不存在就返回最小的正整数 1

    if (nums==null||nums.length==0) {
    return1;
            }

    image.gif

    在第一个循环之后判断如果数组中没有 1 那么就返回 1

    if (nums[i] -1>=1) {
    return1;
            }

    image.gif

    此时如果忽略库函数的复杂度那么本题我们所使用的复杂度就是:空间复杂度 O(1),时间复杂度 O(n)。

    image.png

    完整代码:

    importjava.util.*;
    publicclassSolution {
    publicintminNumberDisappeared (int[] nums) {
    // write code hereif (nums==null||nums.length==0) {
    return1;
            }
    intret=0;
    intlen=nums.length;
    Arrays.sort(nums);
    inti=0;
    while (i<len&&nums[i] <=0) {
    i++;
            }
    if (nums[i] -1>=1) {
    return1;
            }
    while (i<len-1) {
    if (nums[i] +1<nums[i+1]) {
    returnnums[i] +1;
                }
    i++;
            }
    ret=nums[len-1] +1;
    returnret;
        }
    }

    image.gif

    目录
    相关文章
    |
    20天前
    等差数列输出 10x10 矩阵格式
    【10月更文挑战第26天】等差数列输出 10x10 矩阵格式。
    28 5
    |
    6月前
    【每日一题Day278】LC2500删除每行中的最大值 | 排序+模拟
    【每日一题Day278】LC2500删除每行中的最大值 | 排序+模拟
    47 0
    |
    6月前
    PTA-求奇数分之一序列前N项和
    求奇数分之一序列前N项和
    92 0
    |
    6月前
    |
    存储
    nowcoder NC236题 最大差值
    【1月更文挑战第2天】
    47 0
    |
    Serverless
    华为机试HJ62:查找输入整数二进制中1的个数
    华为机试HJ62:查找输入整数二进制中1的个数
    华为机试HJ58:输入n个整数,输出其中最小的k个
    华为机试HJ58:输入n个整数,输出其中最小的k个
    华为机试HJ9:提取不重复的整数
    华为机试HJ9:提取不重复的整数
    |
    容器
    华为机试HJ10:字符个数统计
    华为机试HJ10:字符个数统计
    LeetCode-41 缺失的第一个正整数
    LeetCode-41 缺失的第一个正整数
    定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
    定义一个长度为10的整型数组,循环输入10个整数。 然后将输入一个整数,查找此整数,找到后输出下标,没找到给出提示。
    216 0