• nowcoder NC30 缺失的第一个正整数


    目录

    题目描述:

    分析:

    完整代码:


     

    题目链接: icon-default.png?t=N7T8https://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)了所以这个方法应该是实在想不出解法了再使用。

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

    1. public int minNumberDisappeared (int[] nums) {
    2. Arrays.sort(nums);
    3. }

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

    1. public int minNumberDisappeared (int[] nums) {
    2. int ret = 0; //返回值
    3. int len = nums.length; //数组长度
    4. Arrays.sort(nums);
    5. int i = 0; //记录数组遍历的位置
    6. while (i < len && nums[i] <= 0) {
    7. i++;
    8. }
    9. }

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

    1. while (i < len - 1) {
    2. if (nums[i] + 1 < nums[i+1]) {
    3. return nums[i] + 1;
    4. }
    5. i++;
    6. }
    7. ret = nums[len-1] + 1;
    8. return ret;

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

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

    1. if (nums == null || nums.length == 0) {
    2. return 1;
    3. }

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

    1. if (nums[i] - 1 >= 1) {
    2. return 1;
    3. }

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

     

    完整代码:

    1. import java.util.*;
    2. public class Solution {
    3. public int minNumberDisappeared (int[] nums) {
    4. // write code here
    5. if (nums == null || nums.length == 0) {
    6. return 1;
    7. }
    8. int ret = 0;
    9. int len = nums.length;
    10. Arrays.sort(nums);
    11. int i = 0;
    12. while (i < len && nums[i] <= 0) {
    13. i++;
    14. }
    15. if (nums[i] - 1 >= 1) {
    16. return 1;
    17. }
    18. while (i < len - 1) {
    19. if (nums[i] + 1 < nums[i+1]) {
    20. return nums[i] + 1;
    21. }
    22. i++;
    23. }
    24. ret = nums[len-1] + 1;
    25. return ret;
    26. }
    27. }
  • 相关阅读:
    我用Python写了几个摸鱼小游戏,赐你2023年度上班上学摸鱼必备良品!(附源码)
    C# 流Stream详解(3)——FileStream源码
    【寻找密码】python实现-附ChatGPT解析
    1. Unified Structure Generation for Universal Information Extraction 阅读笔记
    SpringBoot 源码分析(二) 自动装配过程分析
    tcp状态图
    unity sdk -Firebase 统计接入
    Java--正则表达式
    夜游综合体项目赋能城市旅游形态的多样化
    开源大模型部署及推理所需显卡成本必读之一
  • 原文地址:https://blog.csdn.net/2302_76339343/article/details/132908458