给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
示例1:
输入: [1,2,0]
输出: 3
示例2:
输入: [3,4,-1,1]
输出: 2
示例3:
输入: [7,8,9,11,12]
输出: 1
使用语言 java
题目函数为:public int firstMissingPositive(int[] nums)
先对nums[]数组进行处理,将重复的部分和小于1的部分去除,并用length记录现有的数组长度。
对数组进行遍历,得到最大值max,最小值min,当最小值大于1时,直接返回1。
现在我们可以先认为最小值为1,此时若最大值max大于length,即比数组nums长度还大,说明数组已有的数字无法填满1到max,即说明要返回的答案必定小于max,此时在数组nums中去除max不会影响答案,重复此过程,直到max==length的数,返回max+1即是答案。
由于水平有限,算法十分粗糙,有很多可以优化的地方,也有其他更好的算法。
代码如下:
```java
public int firstMissingPositive(int[] nums) {
HashMap map = new HashMap<Integer,Integer>(); //用于去除重复的数字
int min = Integer.MAX_VALUE, max = 0, length = nums.length;
for (int i = 0; i< nums.length; i++){
if (nums[i] > length || nums[i] < 1){ //去除数组中不需要的数字
length--;
nums[i] = 0;
continue;
}
if (map.containsKey(nums[i])) {
length--;
nums[i] = 0;
}else{
map.put(nums[i], 1);
}
}
do{ //重复算法,去除max>length的部分
max = 0;
for (int i = 0; i < nums.length; i++){
if (nums[i] > length){
length--;
nums[i] = 0;
continue;
}
if (nums[i] > max){
max = nums[i];
}
if (nums[i] < min && nums[i] >= 1){
min = nums[i];
}
}
if (min > 1) return 1; //最小值大于1,直接返回答案
} while (max > length);
return max+1;
}