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

    目录
    相关文章
    |
    4月前
    Leetcode第41题(缺失的第一个正数)
    这篇文章介绍了解决LeetCode第41题“缺失的第一个正数”的两种方法:使用哈希表和调整数组元素位置,以实现时间复杂度为O(n)且只使用常数级别额外空间的解决方案。
    66 0
    Leetcode第41题(缺失的第一个正数)
    |
    9月前
    leetcode-41:缺失的第一个正数
    leetcode-41:缺失的第一个正数
    42 0
    华为机试HJ58:输入n个整数,输出其中最小的k个
    华为机试HJ58:输入n个整数,输出其中最小的k个
    |
    Serverless
    华为机试HJ62:查找输入整数二进制中1的个数
    华为机试HJ62:查找输入整数二进制中1的个数
    LeetCode-41 缺失的第一个正整数
    LeetCode-41 缺失的第一个正整数
    |
    算法 安全 Swift
    LeetCode - #41 缺失的第一个正数
    不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
    输出1234无重复的三位数
    输出1234无重复的三位数
    145 0
    |
    算法
    输出1234无重复三位数
    输出1234无重复三位数
    119 0
    |
    算法
    leetcode:41.缺失的第一个正数
    给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
    59 0
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。
    162 0
    多组输入,一个整数(3~20),表示数字三角形边的长度,即数字的数量,也表示输出行数。