Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] return 3, and [3,4,-1,1] return 2. Your algorithm should run in O(n) time and uses constant space.
在数组中找到第一个漏掉的正整数。若是能够的话,使用O(N)的时间复杂度和O(1)的空间复杂度。java
排序后寻找显然是最快的。排序的时间复杂度要依靠java底层的依赖。以后再用O(N)的时间复杂度找到第一个漏掉的整数后即退出遍历。面试
public int firstMissingPositive(int[] nums) { int size = nums.length; if(size == 0) return 1; Arrays.sort(nums); int positive = 1; for(int i = 0 ; i<size ; i++){ if(nums[i]<positive) continue; if(nums[i]>positive) return positive; positive++; } return positive; }
要实现这种空间复杂度,通常须要有限数量的临时变量来记录遍历的有效范围,再利用原有题目中的数据结构来存储其他的临时变量。这些临时变量能够是排除出的量,也能够是有效量。在这里我用leftPointer
记录有效数字的开始下标(即将无效数字转移到leftPointer左侧),利用maxPositive
记录数组最大有效整数(换句话说,若是一个数组的大小为9,则该数组的最大first missing positive integer即为10,一旦数组中出现重复或是小于1或是大于9的数字,该数字即为无效数字)。当遇到的数字为有效数字时,则将该数字放到对应当前起始下标leftPointer其相应的位置上。数组
public int firstMissingPositive2(int[] nums){ int size = nums.length; int positive = 1; int leftPointer = 0; int maxPositive = size; while(leftPointer<size){ if(nums[leftPointer] == positive){ leftPointer++; positive++; } else if(nums[leftPointer] > maxPositive || nums[leftPointer] < positive || nums[leftPointer]==nums[leftPointer+nums[leftPointer]-positive]){ leftPointer++; maxPositive--; }else{ int temp = nums[leftPointer]; nums[leftPointer] = nums[leftPointer+temp-positive]; nums[leftPointer+temp-positive] = temp; } } return positive; }
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注个人微信公众号!将会不按期的发放福利哦~微信