心得:这道题的主要难度在于O(1)的空间复杂度,这说明只能在原数组上
进行操作,我们可以建立一个映射,映射数组下标和数。将数移动到下标+1
的位置,比如3,就移动到下标为2的地方。
当移动的时候需要进行判断:
1.已经是num=index+1,这时候不需要移动,遍历下一个
2.num不在下标能表示的范围内,不需要移动遍历下一个
3.num在范围内,这时候需要看要与他交换的数,如果这个数等于它的下标+1,
那么不需要移动,便利下一个,如果不等于那么交换他们。
代码:
1 class Solution { 2 public int firstMissingPositive(int[] nums) { 3 if(nums==null||nums.length==0) 4 return 1; 5 int index=0; 6 for(int i=0;i<nums.length;) 7 { 8 if(nums[i]==i+1) 9 { 10 i++; 11 continue; 12 } 13 if(nums[i]-1<0||nums[i]-1>=nums.length) 14 { 15 i++; 16 continue; 17 18 } 19 else 20 { 21 if(nums[nums[i]-1]==nums[i]) 22 { 23 i++; 24 continue; 25 } 26 else 27 { 28 int tmp=nums[nums[i]-1]; 29 nums[nums[i]-1]=nums[i]; 30 nums[i]=tmp; 31 } 32 33 } 34 } 35 while(index<nums.length) 36 { 37 if(nums[index]!=index+1) 38 return index+1; 39 else 40 index++; 41 } 42 return index+1; 43 } 44 }