给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。
提示:
你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。
class Solution { private void swap(int[] nums,int i, int k){ int temp = nums[i]; nums[i] = nums[k]; nums[k] = temp; } public int firstMissingPositive(int[] nums) { //方法1,先排序,再用二分法,时间复杂度O(nlogn)空间复杂度O(1) //方法2,把无序数组存入哈希表,然后在遍历哈希表。时间复杂度O(n),空间复杂度O(n) //方法3,原地哈希法,把i个元素放在第nums[i]-1个位置上,再遍历一遍找到缺失的数字 int len = nums.length; for(int i=0;i<len;i++){//nums[nums[i]-1]查看第i个元素的值是否放正确 while(nums[i]<len&&nums[i]>0&&nums[i]!=nums[nums[i]-1]){ //当前数>0才需要排序,<len才可以放进当前的数组中,此处用while复杂度不会高,因为均摊复杂度 //swap交换i个元素放在第nums[i]-1个位置上,此时需要再次比对 //当前i个位置交换后的数是否正确,如果不对需要重复 swap(nums,i,nums[i]-1); } } for(int j=0;j<len;j++){ if(j+1!=nums[j]){ return j+1; } } //全都遍历没有问题那么缺失的数字为当前数组最大的数len+1; return len+1; } }