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; } } }