博客
关于我
王道数据结构2.2.3——13、找出整数数组中未出现的最小正整数
阅读量:626 次
发布时间:2019-03-14

本文共 1615 字,大约阅读时间需要 5 分钟。

思路分析

寻找整数数组中最小的未出现的正整数,可以通过以下两种方法实现。

方法一:逐次检查数组

  • 排序数组:首先将整数数组进行排序,方便后续查找。
  • 指针寻找最小数:让指针从数组起始位置开始,逐步移动到数组末尾。
  • 跳过负数:在指针移动过程中,继续向前寻找,直到遇到第一个大于等于0的数。
  • 验证连续性:检查当前数是否比前一个数小1。如果不是,则说明存在缺失的最小正整数,即为当前未出现的最小正整数。
  • 这种方法的核心思想是利用数组的顺序关系,通过逐次检查每个数与前一个数的关系,找到最小缺失的正整数。

    方法二:标记已出现数字

  • 确定数值范围:首先确定数组中最小和最大值,确定要检查的数值范围。
  • 初始化标记数组:创建一个与数值范围相等的数组,用于标记数字是否在原数组中出现过。
  • 填充标记数组:遍历原数组,将每个出现的数字对应的位置标记为已出现。
  • 查找未标记的最小数:从标记数组的最前端开始,依次查找最小的未被标记的数值,这个数即为最小的未出现的正整数。
  • 这种方法的优势在于代码实现相对简单,且能有效找出最小的缺失正整数。


    代码优化与解释

    以下是基于方法二的代码实现,修改后的版本会更简洁且易于理解:

    void findMin(int A[], int n, int &result) {    if (n == 0) {        result = 1;        return;    }    // 确定数值范围    int min = A[0];    int max = A[0];    for (int i = 0; i < n; i++) {        if (A[i] < min) {            min = A[i];        } else if (A[i] > max) {            max = A[i];        }    }    // 确保至少有一个非负数    if (min <= 0) {        min = 1;    }    // 标记数组    int size = max - min + 1;    int present[size];    for (int i = 0; i < size; i++) {        present[i] = 0;    }    for (int i = 0; i < n; i++) {        if (A[i] < 0) {            continue;        }        int value = A[i];        int index = value - min;        if (index >= 0 && index < size) {            present[index] = 1;        }    }    // 寻找最小的未出现的数    for (int i = 0; i < size; i++) {        if (present[i] == 0) {            result = i + min;            return;        }    }    result = size + min; // 如果没有缺失的数}
  • 初始化:首先确定数组中最小值min和最大值maxmin默认为数组第一个元素的值。
  • 处理负值:如果min小于等于0,将其调整为1,以确保数值范围从1开始。
  • 创建标记数组:长度为max - min + 1,初始化所有值为0。
  • 标记已出现的数字:遍历原数组,将每个数字A[i]标记为已出现。
  • 查找未被标记的最小数:从左到右在标记数组中查找第一个未标记的位置,结果即为所求的最小缺失正整数。
  • 通过这种方法,代码实现简洁且高效,逻辑清晰,适合处理各种整数数组。

    转载地址:http://bpaoz.baihongyu.com/

    你可能感兴趣的文章
    关于JS的数据类型
    查看>>
    JAVA经典算法40题(3)
    查看>>
    idea在连接mysql数据库时区错误
    查看>>
    springboot中访问static下的图片没反应
    查看>>
    PHP文件域上传文件
    查看>>
    阿里云服务器建站——centos7部署apache+mysql+php
    查看>>
    虚拟机安装centos7无法联网问题
    查看>>
    2021-05-14
    查看>>
    2021-05-15
    查看>>
    PHP入门笔记--include和require
    查看>>
    Java IO整理总结之字符流
    查看>>
    1. Two Sum
    查看>>
    SpringMVC接收数据时String转Date的问题
    查看>>
    Spring Boot在idea上热部署
    查看>>
    探针台工作原理
    查看>>
    Kali-linux:nmap命令
    查看>>
    php端口直驱网络打印机,能自定义格式
    查看>>
    Django学习笔记:主动触发404异常
    查看>>
    AJAX获取响应数据、状态、头部等信息
    查看>>
    我的OpenGL学习摘要_变换_矩阵
    查看>>