直接暴力解法:找到无序数组中未出现的最小正整数,要求空间复杂度为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;
}
}
查看6道真题和解析
