2
2
#include <stdlib.h>
3
3
#include <assert.h>
4
4
5
- int lengthOfLIS (int * nums , int numsSize ) {
5
+ /* Dynamic Programming, O(n*n) */
6
+ int lengthOfLIS0 (int * nums , int numsSize ) {
6
7
if (nums == NULL || numsSize == 0 ) return 0 ;
7
8
int * dp = (int * )malloc (numsSize * sizeof (int ));
8
9
int i , j ;
@@ -17,9 +18,39 @@ int lengthOfLIS(int* nums, int numsSize) {
17
18
if (v > max )
18
19
max = v ;
19
20
}
21
+ free (dp );
20
22
return max ;
21
23
}
22
24
25
+ /* Trace the LIS using an array and use binary search, O(nlogn) */
26
+ int lengthOfLIS (int * nums , int numsSize ) {
27
+ if (nums == NULL || numsSize == 0 ) return 0 ;
28
+ int * lis = (int * )malloc (numsSize * sizeof (int ));
29
+ lis [0 ] = nums [0 ];
30
+ int len = 1 ;
31
+ int i ;
32
+ for (i = 1 ; i < numsSize ; i ++ ) {
33
+ if (nums [i ] > lis [len - 1 ]) {
34
+ lis [len ++ ] = nums [i ];
35
+ }
36
+ else {
37
+ int l = 0 , r = len - 1 ;
38
+ while (l < r ) {
39
+ int m = l + (r - l ) / 2 ;
40
+ if (lis [m ] >= nums [i ]) {
41
+ r = m ;
42
+ }
43
+ else {
44
+ l = m + 1 ;
45
+ }
46
+ }
47
+ lis [l ] = nums [i ];
48
+ }
49
+ }
50
+ free (lis );
51
+ return len ;
52
+ }
53
+
23
54
int main () {
24
55
int nums0 [] = { 10 , 9 , 2 , 5 , 3 , 7 , 101 , 18 };
25
56
int nums1 [] = { 1 , 0 , 1 , 1 };
0 commit comments