File tree Expand file tree Collapse file tree 1 file changed +58
-0
lines changed Expand file tree Collapse file tree 1 file changed +58
-0
lines changed Original file line number Diff line number Diff line change
1
+ class Solution (object ):
2
+ def firstMissingPositive (self , nums ):
3
+ N = len (nums )
4
+
5
+ if 1 not in nums : return 1
6
+
7
+ for i , num in enumerate (nums ):
8
+ if num <= 0 or num > N :
9
+ nums [i ] = 1
10
+
11
+ for i in xrange (N ):
12
+ a = abs (nums [i ])
13
+
14
+ if a == N :
15
+ nums [0 ] = - abs (nums [0 ])
16
+ else :
17
+ nums [a ] = - abs (nums [a ])
18
+
19
+ for i in xrange (1 , N ):
20
+ if nums [i ]> 0 : return i
21
+ if nums [0 ]> 0 : return N
22
+
23
+ return N + 1
24
+
25
+ """
26
+ Time: O(N), each num is going to be swap once.
27
+ Space: O(1).
28
+
29
+ For nums with length N, the answer must be in between 1~N+1.
30
+
31
+ [1] So for number between 1~N, lets put them in the right place.
32
+ number 1 will be stored at index 0.
33
+ number 2 will be stored at index 1.
34
+ ...
35
+ number n will be stored at index n-1.
36
+
37
+
38
+ [2] Check if any number are not in place.
39
+
40
+ [3] If all the number are in place, then the ans must be N+1.
41
+ """
42
+ class Solution (object ):
43
+ def firstMissingPositive (self , nums ):
44
+ N = len (nums )
45
+
46
+ #[1]
47
+ for i in xrange (N ):
48
+ while 1 <= nums [i ]<= N and nums [i ]!= i + 1 :
49
+ j = nums [i ]- 1
50
+ if nums [i ]== nums [j ]: break #otherwise they are going to keep swapping infinitely, because one of them is not inplace.
51
+ nums [i ], nums [j ] = nums [j ], nums [i ]
52
+
53
+ #[2]
54
+ for i in xrange (N ):
55
+ if nums [i ]!= i + 1 : return i + 1
56
+
57
+ #[3]
58
+ return N + 1
You can’t perform that action at this time.
0 commit comments