直接暴力解法:找到无序数组中未出现的最小正整数,要求空间复杂度为1
数组中未出现的最小正整数
http://www.nowcoder.com/questionTerminal/8cc4f31432724b1f88201f7b721aa391
题目描述
给定一个无序数组arr,找到数组中未出现的最小正整数
例如arr = [-1, 2, 3, 4]。返回1
arr = [1, 2, 3, 4]。返回5
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
示例1
输入
复制
[-1,2,3,4]
输出
复制
1
空复为1,就不能使用map集合之类的快捷方法了,直接暴力解法,容易理解:
1、排序
2、从正整数部分开始从1比较,如果是在开头部分,那么直接返回1;
如果实在中间部分,那么比较值递增,出现的第一个不等的数字就是;
如果比较到最后都符合,那么返回下一个数即可;
前两个可以合并,就是如下的程序:
牛客的测试用例 运行时间: 933ms 占用内存: 247960KB
但是用例有个小缺陷,就是如果前面一直都是符合要求的数字,没有返回最后的下一个值是测试不出来的,比如:[1 2 3 4 5] 前面都是符合的,应该返回6,但是测试用例好像没有覆盖这种情况,本程序还是考虑到的。
import java.util.*; public class Solution { /** * return the min number * @param arr int整型一维数组 the array * @return int整型 */ public int minNumberdisappered (int[] arr) { // 找到最小的数字,然后返回比它还小一个的数字 Arrays.sort(arr); //先排序 int result = 1; //输出结果 int index = 1; //用于对比的最小正整数 for(int j=0; j<arr[arr.length-1]; j++){ //要比较到最大值 if(arr[j] <= 0) continue; //将非正整数跳过 if(j==arr.length-1 && arr[j]==index) //比较到最后前面都相同,那么返回下一个比较值 return index+1; if(arr[j] != index){ //从1开始比较,涵盖返回值在开头和中间的情况 result = index; }else{ index++; //注意要将比较值加1 } } return result; } }