题解 | #数组中未出现的最小正整数#时间O(n)空间O(1)的超简单解法,胎教毕业也能懂
数组中未出现的最小正整数
http://www.nowcoder.com/practice/8cc4f31432724b1f88201f7b721aa391
废话不多说直接上算法流程:
- 设置和初始化两个变量
i=0
和pre=arr[0]
,分别代表指针位置和上一个数 - 整个数组其实可以分为两部分:负数部分和整数部分
- 结果返回最小正整数,所以一开始遇到负数就先记录
pre=arr[i]
再i++
往后移,直到遇到正数或者到了数组最后面也就是i == arr.length
- 如果走到了数组最后面,说明整个数组都说负数,那么直接
return 1
退出程序 - 如果没有走到数组最后面,那么说明整数部分要开始了,按照题目要求整数部分是从1开始的,所以设置
pre = 0
- 如果走到了数组最后面,说明整个数组都说负数,那么直接
- 继续移动指针,如果
i < arr.length && arr[i] == pre+1
就继续先记录'pre = arr[i]'再i++
- 经过上述步骤i要么移动到了数组最后面,要么移动到了确属数字的哪一位,这时候
pre
正好记录的就是确属整数的前一个。所以最后直接return pre+1
就是最终答案了。import java.util.*; public class Solution { /** * return the min number * @param arr int整型一维数组 the array * @return int整型 */ public int minNumberdisappered (int[] arr) { //走到非0的索引处,上一个数 int i = 0, pre = arr[0]; while(i < arr.length && arr[i] < 0) { pre = arr[i]; i++; } // 如果走到了最后,就是整个数组都是负数,直接返回1 if(i == arr.length) return 1; // 没有走到最后,那么从正整数1开始,所以上一个数是0 else pre = 0; // 如果当前数是上一个数加一,就继续往后走 while(i < arr.length && arr[i] == pre+1) { pre++; i++; } // 最后返回上一个数+1即可 return pre+1; } }