Java数组中未出现的最小正整数
数组中未出现的最小正整数
http://www.nowcoder.com/questionTerminal/8cc4f31432724b1f88201f7b721aa391
要求时间复杂度为O(n),空间复杂度为O(1),因此不能进行排序,也不可以使用哈希表。
可以考虑原地处理数组,即在一次遍历过程中将数组中的数值交换到对应 [数值-1] 的下标中,超出数组范围的不作处理。处理完成后遍历数组找到第一个 数值!=下标+1 的数值就是未出现的最小正整数。
public class Solution {
/**
* return the min number
* @param arr int整型一维数组 the array
* @return int整型
*/
public int minNumberdisappered (int[] arr) {
// write code here
//空间复杂度为n的话,可以使用哈希表,但是此处要求原地处理,即空间复杂度为1
//且时间复杂度为n,也不能先排序
//处理数组
for(int i = 0; i < arr.length; i++){
//符合要求的不再处理,只处理不合要求的
if(arr[i]-1 != i) rec(arr,i);
}
//如果位置和值不对应,说明处理后没有当前值,第一个就是最小的
for(int i = 0; i < arr.length; i++){
if(arr[i]-1 != i) return i+1;
}
return arr.length+1;
}
//如果在数组长度范围内,则递归处理,否则不处理
public void rec(int[] arr, int index){
int val = arr[index];
if(val-1 == index) return;
if(val > 0 && val <= arr.length){
rec(arr,val-1);
arr[val-1] = val;
}
}
}