【题目】: 给定一个无序整型数组arr,找到数组中未出现的最小正整数。要求时间复杂度为O(N),空间复杂度为O(1)。

例如:

arr=[-1,2,3,4]。返回1。

arr=[1,2,3,4]。返回5。

【解法】
一、穷举查找
最小正整数是1,所以常规的方法就是在数组中找1,然后是2,依次找下去…。一直找到第一个没有出现的正整数,这个数就是未出现的最小的正整数。

for i = 1 to ndo if i not in A then return ireturn n+1

显然,这里的算法复杂度是O(n^2)。

二、先排序再查找
第一种方法,每次查找都是线性查找,要改进最先想到的自然是二分查找, 所以:
先排序,用O(nlgn)的快速排序、归并排序或者堆排序;因为数组中的元素是一些自然数,我们甚至可以使用O(n) 的基数排序,当然,需要更多的内存。
对1..n进行判断,复杂度也为O(nlgn)
所以,整体的算法复杂度为O(nlgn)

三、利用这种数组的特性

  1. 先排序
  2. 再利用该特性搜索
for i = 1 to ndo if A[i] > ithen return ireturn n+1

注意到,如果我们使用基数排序,可以将复杂度降低到O(n)。

四、所有可能出现的情况。
(1) arr为整数1,2,3…N的一个随机排列,那个未出现的最小正整数就是N+1。

(2) arr中有小于1或者大于N的数出现(我们称之为“不合法”的数),则未出现的最小正整数一定在1到N中间(因为数组一共只有N个数,如果出现不合法的数,则出现的1到N之间的数的个数一定小于N,故一定有没有出现的数)。

int missMinNum(int arr[]){int l = 0; //l表示已经从1到L已经出现(左边界),l的初值为0。int r = arr.length; //如果一个数字过大(不合法),就会被扔掉,用r表示这个右边界,r初始值为arr长度。//        int temp;while(l < r){if(arr[l] == l +1){l++;}else if(arr[l]> r || arr[l] <= l || arr[arr[l] - 1] == arr[l])//不合法{arr[l] =arr[--r];}else//合法但是没有在理想的位置上{temp = arr[l];arr[l] =arr[arr[l] - 1];arr[temp - 1] = temp;}}return l + 1;}

时间复杂度O(n),改变了原数组。
  

求数组中未出现的最小正整数相关推荐

  1. 常考数据结构与算法:数组中未出现的最小正整数

    参考博客 https://www.cnblogs.com/apeway/p/10764597.html 题目描述 给定一个无序数组arr,找到数组中未出现的最小正整数 例如arr = [-1, 2, ...

  2. 牛客题霸 [数组中未出现的最小正整数] C++题解/答案

    牛客题霸 [数组中未出现的最小正整数] C++题解/答案 题目描述 给定一个无序数组arr,找到数组中未出现的最小正整数 例如arr = [-1, 2, 3, 4].返回1 arr = [1, 2, ...

  3. 【408计算机考研】|【2018统考真题-41】| 给定一个含 n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数

    目录 一.题目 二.解答 三.测试数据 一.题目   给定一个含 n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算 法,找出数组中未出现的最小正整数.例如,数组{-5, 3, 2, 3}中未 ...

  4. 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

    笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...

  5. 牛客题霸 NC30 数组中未出现的最小正整数

    解决方案 Go 版本一 func minNumberdisappered(arr []int) int {// write code heren := len(arr)for i := 0; i &l ...

  6. 数据结构 2018统考题【找出数组中未出现的最小正整数】

    王道论坛课本

  7. 找出数组中未出现的最小正整数

    考研 数据结构 题.

  8. 找出数组中从未出现的最小正整数java实现

    1 /** 2 * 找出未出现的最小正整数 3 * @param A 4 * @param n 5 * @date 2016-10-7 6 * @author shaobn 7 */ 8 public ...

  9. 如何求数组中绝对值最小的数?

    """ 有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数.例如,数组[-10,-5,-2,7,15,50],该数组中绝对值最小的数是2 &q ...

最新文章

  1. python统计窗口函数怎么处理_python移动窗口函数
  2. JS数组去重的6种算法实现
  3. CodeForces-734E Anton and Tree 树的直径
  4. vs linux 交叉编译,Visual Studio交叉编译器提供对ARM的支持
  5. python垃圾回收机制原理_如何理解和掌握Python垃圾回收机制?
  6. RHEL 6.0安装Qt
  7. mysql505复位密码_mysql5 如何复位根用户密码[官方文档]
  8. linux打开服务iis,如何在Linux中引导时列出启动服务?
  9. LeetCode 1091. 二进制矩阵中的最短路径(BFS)
  10. 经验 | CVPR 2021 Area Chair:谈CVPR 2021审稿
  11. 使用Maven搭建Struts2框架的开发环境
  12. oracle创建表不在对应表空间,oracle创建表空间
  13. linux内存管理源码分析 - 页框分配器
  14. json规范,平时不注意的特殊符号
  15. arcgis影像怎么去黑边_arcgis遥感图像去黑边林林种种(至少7种方法)
  16. 编译原理(龙书第二版)--怎么求FOLLOW集
  17. 修改html2canvas生成图片的dpi
  18. 【xla】四、【构图阶段】BuildXlaOpsPass
  19. OpenMesh-网格光顺的算法
  20. 网络通信技术(TCP/IP)

热门文章

  1. 大数据导论习题_2018年大数据试题及答案.doc
  2. 淘宝推出大物流计划 物流宝平台正式上线
  3. 分享抖音壁纸号年赚20W的玩法,一个冷门也偏门的正规网络项目
  4. lucene搜索原理讲解
  5. 洛谷P4363 [九省联考2018]一双木棋chess
  6. Fabric-samples v1.4 搭建及构建第一个实例
  7. 大学生学习指导课程材料
  8. 【黄啊码】我问ChatGPT如何学习PHP语言,它是这么说的
  9. 我的家庭私有云计划-9
  10. 关于公司宣传册设计这几点你一定要知道