求数组中未出现的最小正整数
【题目】: 给定一个无序整型数组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)
三、利用这种数组的特性
- 先排序
- 再利用该特性搜索
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),改变了原数组。
求数组中未出现的最小正整数相关推荐
- 常考数据结构与算法:数组中未出现的最小正整数
参考博客 https://www.cnblogs.com/apeway/p/10764597.html 题目描述 给定一个无序数组arr,找到数组中未出现的最小正整数 例如arr = [-1, 2, ...
- 牛客题霸 [数组中未出现的最小正整数] C++题解/答案
牛客题霸 [数组中未出现的最小正整数] C++题解/答案 题目描述 给定一个无序数组arr,找到数组中未出现的最小正整数 例如arr = [-1, 2, 3, 4].返回1 arr = [1, 2, ...
- 【408计算机考研】|【2018统考真题-41】| 给定一个含 n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数
目录 一.题目 二.解答 三.测试数据 一.题目 给定一个含 n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算 法,找出数组中未出现的最小正整数.例如,数组{-5, 3, 2, 3}中未 ...
- 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。
笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...
- 牛客题霸 NC30 数组中未出现的最小正整数
解决方案 Go 版本一 func minNumberdisappered(arr []int) int {// write code heren := len(arr)for i := 0; i &l ...
- 数据结构 2018统考题【找出数组中未出现的最小正整数】
王道论坛课本
- 找出数组中未出现的最小正整数
考研 数据结构 题.
- 找出数组中从未出现的最小正整数java实现
1 /** 2 * 找出未出现的最小正整数 3 * @param A 4 * @param n 5 * @date 2016-10-7 6 * @author shaobn 7 */ 8 public ...
- 如何求数组中绝对值最小的数?
""" 有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数.例如,数组[-10,-5,-2,7,15,50],该数组中绝对值最小的数是2 &q ...
最新文章
- python统计窗口函数怎么处理_python移动窗口函数
- JS数组去重的6种算法实现
- CodeForces-734E Anton and Tree 树的直径
- vs linux 交叉编译,Visual Studio交叉编译器提供对ARM的支持
- python垃圾回收机制原理_如何理解和掌握Python垃圾回收机制?
- RHEL 6.0安装Qt
- mysql505复位密码_mysql5 如何复位根用户密码[官方文档]
- linux打开服务iis,如何在Linux中引导时列出启动服务?
- LeetCode 1091. 二进制矩阵中的最短路径(BFS)
- 经验 | CVPR 2021 Area Chair:谈CVPR 2021审稿
- 使用Maven搭建Struts2框架的开发环境
- oracle创建表不在对应表空间,oracle创建表空间
- linux内存管理源码分析 - 页框分配器
- json规范,平时不注意的特殊符号
- arcgis影像怎么去黑边_arcgis遥感图像去黑边林林种种(至少7种方法)
- 编译原理(龙书第二版)--怎么求FOLLOW集
- 修改html2canvas生成图片的dpi
- 【xla】四、【构图阶段】BuildXlaOpsPass
- OpenMesh-网格光顺的算法
- 网络通信技术(TCP/IP)