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

    目录
    相关文章
    |
    8天前
    等差数列输出 10x10 矩阵格式
    【10月更文挑战第26天】等差数列输出 10x10 矩阵格式。
    19 5
    华为机试HJ58:输入n个整数,输出其中最小的k个
    华为机试HJ58:输入n个整数,输出其中最小的k个
    |
    Serverless
    华为机试HJ62:查找输入整数二进制中1的个数
    华为机试HJ62:查找输入整数二进制中1的个数
    华为机试HJ9:提取不重复的整数
    华为机试HJ9:提取不重复的整数
    LeetCode-41 缺失的第一个正整数
    LeetCode-41 缺失的第一个正整数
    输入三个数字,从大到小输出
    输入三个数字,从大到小输出
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    139 0
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    |
    Java 测试技术
    Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
    Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
    210 0
    Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3
    可多次输入,一个整数(2--20),表示输出的行数,也表示X的反斜线和正斜线的长度...输出时,每行输出,都为X
    可多次输入,一个整数(2--20),表示输出的行数,也表示X的反斜线和正斜线的长度...输出时,每行输出,都为X
    111 0
    可多次输入,一个整数(2--20),表示输出的行数,也表示X的反斜线和正斜线的长度...输出时,每行输出,都为X
    输入7个整数(0-100),代表7个整数,用空格隔开.小数点后保留两位小数,每行输入后换行.去掉一个最高分一个最低分,输出每组的平均分.用一个循环完成(7个面试官问题)
    输入7个整数(0-100),代表7个整数,用空格隔开.小数点后保留两位小数,每行输入后换行.去掉一个最高分一个最低分,输出每组的平均分.用一个循环完成(7个面试官问题)
    159 0
    输入7个整数(0-100),代表7个整数,用空格隔开.小数点后保留两位小数,每行输入后换行.去掉一个最高分一个最低分,输出每组的平均分.用一个循环完成(7个面试官问题)