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

    目录
    相关文章
    |
    Python
    Python基础(输出五行五角星,数量每行递增/输出九九乘法表)
    需求:在控制台连续输出五行*, 每一行星星的数量依次递增 思路:使用while循环输出五行内容, 依次输出数字1到5, 再使用数字乘以字符串'*', 即可在每行输出一个星星, 两个星星, ... 五个星星, 从而实现递增
    814 1
    Python基础(输出五行五角星,数量每行递增/输出九九乘法表)
    |
    7月前
    |
    存储
    nowcoder NC236题 最大差值
    【1月更文挑战第2天】
    55 0
    |
    7月前
    输入一个字符串,统计其中字符A的数量并且输出,输入共有一行,为一个不带空格的字符串(其中字符数不超过100),输出一行,包含一个整数,为输入字符串中的A的数量
    输入一个字符串,统计其中字符A的数量并且输出,输入共有一行,为一个不带空格的字符串(其中字符数不超过100),输出一行,包含一个整数,为输入字符串中的A的数量
    |
    Serverless
    华为机试HJ62:查找输入整数二进制中1的个数
    华为机试HJ62:查找输入整数二进制中1的个数
    华为机试HJ58:输入n个整数,输出其中最小的k个
    华为机试HJ58:输入n个整数,输出其中最小的k个
    LeetCode-41 缺失的第一个正整数
    LeetCode-41 缺失的第一个正整数
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    146 0
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    输入7个整数(0-100),代表7个整数,用空格隔开.小数点后保留两位小数,每行输入后换行.去掉一个最高分一个最低分,输出每组的平均分.用一个循环完成(7个面试官问题)
    输入7个整数(0-100),代表7个整数,用空格隔开.小数点后保留两位小数,每行输入后换行.去掉一个最高分一个最低分,输出每组的平均分.用一个循环完成(7个面试官问题)
    178 0
    输入7个整数(0-100),代表7个整数,用空格隔开.小数点后保留两位小数,每行输入后换行.去掉一个最高分一个最低分,输出每组的平均分.用一个循环完成(7个面试官问题)
    可多次输入,一个整数(2--20),表示输出的行数,也表示X的反斜线和正斜线的长度...输出时,每行输出,都为X
    可多次输入,一个整数(2--20),表示输出的行数,也表示X的反斜线和正斜线的长度...输出时,每行输出,都为X
    121 0
    可多次输入,一个整数(2--20),表示输出的行数,也表示X的反斜线和正斜线的长度...输出时,每行输出,都为X
    02:输出第二个整数
    02:输出第二个整数
    124 0

    热门文章

    最新文章