当前位置: 首页 > news >正文

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)了所以这个方法应该是实在想不出解法了再使用。

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

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

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

    public int minNumberDisappeared (int[] nums) {
        int ret = 0; //返回值
        int len = nums.length; //数组长度
        Arrays.sort(nums);
        int i = 0; //记录数组遍历的位置

        while (i < len && nums[i] <= 0) {
            i++;
        }
    }

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

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

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

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

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

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

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

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

 

完整代码:

import java.util.*;


public class Solution {

    public int minNumberDisappeared (int[] nums) {
        // write code here
        if (nums == null || nums.length == 0) {
            return 1;
        }
        int ret = 0;
        int len = nums.length;
        Arrays.sort(nums);
        int i = 0;

        while (i < len && nums[i] <= 0) {
            i++;
        }
        if (nums[i] - 1 >= 1) {
            return 1;
        }
        while (i < len - 1) {
            if (nums[i] + 1 < nums[i+1]) {
                return nums[i] + 1;
            }
            i++;
        }
        ret = nums[len-1] + 1;
        return ret;
    }
}

相关文章:

  • 学习python和anaconda的经验
  • c语言输出杨辉三角
  • 安卓恶意应用识别(三)(批量反编译与属性值提取)
  • C【数组】
  • 中国IT分销行业市场研究与投资战略报告(2023版)
  • Android 原生内置应用配置
  • 数据分析三剑客之Pandas
  • 网络安全宣传周|探索AI数字人的魅力和价值所在
  • Windows驱动开发(一)第一个驱动程序
  • 企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
  • 【新版】软考 - 系统架构设计师(总结笔记)
  • useGetState自定义hooks解决useState 异步回调获取不到最新值
  • 阿里云大数据实战记录10:Hive 兼容模式的坑
  • C2基础设施威胁情报对抗策略
  • linux mysql数据库备份
  • SpringCloudGateway网关实战(三)
  • Datagrip 下载、安装教程,详细图文,亲测有效
  • IDEA(2023)修改默认缓存目录
  • 【Effective Python】读书笔记-05类与接口
  • 【送书活动】大模型赛道如何实现华丽的弯道超车
  • 郑庆华任同济大学党委书记
  • 特斯拉一季度净利下滑七成,马斯克表态将继续倡导关税下调
  • 兰斯莫斯想在雅典卫城拍《拯救地球》,希腊当局:价值观不符
  • 青岛:今年计划新增城镇住房约5.77万套,推动房地产市场回稳
  • 中国空间站已在轨实施了200余项科学与应用项目
  • 受贿超8.22亿元,新疆维吾尔自治区党委原副书记李鹏新一审被判死缓