41. 缺失的第一个正数——LeetCode

心得:这道题的主要难度在于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 }

猜你喜欢

转载自www.cnblogs.com/pc-m/p/10959739.html