题目:
给出一个无序的整数型数组,求不在给定数组里的最小的正整数
例如:
给出的数组为[1,2,0] 返回3,
给出的数组为[3,4,-1,1] 返回2.
给出的数组为[4,0,3,2] 返回是1.
给出的数组是[4,2,-1,1] 返回的是3.
给出的数组是[6,7,8,9] 返回的是1.
你需要给出时间复杂度在O(n)之内并且空间复杂度为常数级的算法
思路解析如下:
整体分成两种情况:
第一种情况是:数组是连续的。如果数组内的数字是从1连续存在的。这个时候返回的数组中的最小的正整数是数组长度n+1。如果数组是从0连续存在的,这个时候返回的数组长度n。
比如数组是[1,2,3,4],那么返回的最小的正整数就是5.
比如数组是[0,1,2],返回的最小的正整数是3.
第二种情况是:数组不是连续的。这个时候返回的必然是小于n+1的。于是依次遍历数组中的数是否存在1到n之间的某个数,如果1到n中的某个数遍历不到则返回它。
package com.company;
public class TestNo12 {
public static void main(String[] args) {
TestNo12 t = new TestNo12();
int[] a = {5,6,7,8};
System.out.println(t.firstMissingPositive(a));
}
public int firstMissingPositive(int[] A) {
int a = A.length;
for(int i = 1;i<=a;i++){
int count = 0;
for(int j = 0;j<a;j++){
if(A[j] == i)
count = 1; //说明1到n中的某个数被遍历到
}
if(count == 0)
return i;//说明1到n中的某个数没有遍历到,于是返回没有遍历到的那个数
}
return a+1;
}
}