File tree 6 files changed +81
-198
lines changed
solution/0300-0399/0300.Longest Increasing Subsequence
6 files changed +81
-198
lines changed Original file line number Diff line number Diff line change @@ -134,7 +134,6 @@ class Solution:
134
134
``` python
135
135
class Solution :
136
136
def lengthOfLIS (self , nums : List[int ]) -> int :
137
- n = len (nums)
138
137
d = [nums[0 ]]
139
138
for x in nums[1 :]:
140
139
if x > d[- 1 ]:
@@ -481,8 +480,7 @@ func max(a, b int) int {
481
480
482
481
``` go
483
482
func lengthOfLIS (nums []int ) int {
484
- n := len (nums)
485
- d := make ([]int , n+1 )
483
+ d := make ([]int , len (nums)+1 )
486
484
d[1 ] = nums[0 ]
487
485
size := 1
488
486
for _ , x := range nums[1 :] {
Original file line number Diff line number Diff line change @@ -69,7 +69,6 @@ Greedy & Binary search:
69
69
``` python
70
70
class Solution :
71
71
def lengthOfLIS (self , nums : List[int ]) -> int :
72
- n = len (nums)
73
72
d = [nums[0 ]]
74
73
for x in nums[1 :]:
75
74
if x > d[- 1 ]:
@@ -414,8 +413,7 @@ Greedy & Binary search:
414
413
415
414
``` go
416
415
func lengthOfLIS (nums []int ) int {
417
- n := len (nums)
418
- d := make ([]int , n+1 )
416
+ d := make ([]int , len (nums)+1 )
419
417
d[1 ] = nums[0 ]
420
418
size := 1
421
419
for _ , x := range nums[1 :] {
Original file line number Diff line number Diff line change 1
- class BinaryIndexedTree {
2
- public:
3
- int n;
4
- vector<int > c;
5
-
6
- BinaryIndexedTree (int _n): n(_n), c(_n + 1 ){}
7
-
8
- void update (int x, int val) {
9
- while (x <= n)
10
- {
11
- c[x] = max (c[x], val);
12
- x += lowbit (x);
13
- }
14
- }
15
-
16
- int query (int x) {
17
- int s = 0 ;
18
- while (x > 0 )
19
- {
20
- s = max (s, c[x]);
21
- x -= lowbit (x);
22
- }
23
- return s;
24
- }
25
-
26
- int lowbit (int x) {
27
- return x & -x;
28
- }
29
- };
30
-
31
- class Solution {
32
- public:
33
- int lengthOfLIS (vector<int >& nums) {
34
- set<int > s (nums.begin (), nums.end ());
35
- int idx = 1 ;
36
- unordered_map<int , int > m;
37
- for (int v : s) m[v] = idx++;
38
- BinaryIndexedTree* tree = new BinaryIndexedTree (m.size ());
39
- int ans = 1 ;
40
- for (int v : nums)
41
- {
42
- int x = m[v];
43
- int t = tree->query (x - 1 ) + 1 ;
44
- ans = max (ans, t);
45
- tree->update (x, t);
46
- }
47
- return ans;
48
- }
1
+ class Solution {
2
+ public:
3
+ int lengthOfLIS (vector<int >& nums) {
4
+ int n = nums.size ();
5
+ vector<int > d{nums[0 ]};
6
+ for (int i = 1 ; i < n; ++i)
7
+ {
8
+ if (nums[i] > d[d.size () - 1 ]) d.push_back (nums[i]);
9
+ else
10
+ {
11
+ int idx = lower_bound (d.begin (), d.end (), nums[i]) - d.begin ();
12
+ if (idx == d.size ()) idx = 0 ;
13
+ d[idx] = nums[i];
14
+ }
15
+ }
16
+ return d.size ();
17
+ }
49
18
};
Original file line number Diff line number Diff line change 1
- type BinaryIndexedTree struct {
2
- n int
3
- c []int
4
- }
5
-
6
- func newBinaryIndexedTree (n int ) * BinaryIndexedTree {
7
- c := make ([]int , n + 1 )
8
- return & BinaryIndexedTree {n , c }
9
- }
10
-
11
- func (this * BinaryIndexedTree ) lowbit (x int ) int {
12
- return x & - x
13
- }
14
-
15
- func (this * BinaryIndexedTree ) update (x , val int ) {
16
- for x <= this .n {
17
- if this .c [x ] < val {
18
- this .c [x ] = val
19
- }
20
- x += this .lowbit (x )
21
- }
22
- }
23
-
24
- func (this * BinaryIndexedTree ) query (x int ) int {
25
- s := 0
26
- for x > 0 {
27
- if s < this .c [x ] {
28
- s = this .c [x ]
29
- }
30
- x -= this .lowbit (x )
31
- }
32
- return s
33
- }
34
-
35
- func lengthOfLIS (nums []int ) int {
36
- s := make (map [int ]bool )
37
- for _ , v := range nums {
38
- s [v ] = true
39
- }
40
- var t []int
41
- for v , _ := range s {
42
- t = append (t , v )
43
- }
44
- sort .Ints (t )
45
- m := make (map [int ]int )
46
- for i , v := range t {
47
- m [v ] = i + 1
48
- }
49
- ans := 1
50
- tree := newBinaryIndexedTree (len (m ))
51
- for _ , v := range nums {
52
- x := m [v ]
53
- t := tree .query (x - 1 ) + 1
54
- if ans < t {
55
- ans = t
56
- }
57
- tree .update (x , t )
58
- }
59
- return ans
1
+ func lengthOfLIS (nums []int ) int {
2
+ d := make ([]int , len (nums )+ 1 )
3
+ d [1 ] = nums [0 ]
4
+ size := 1
5
+ for _ , x := range nums [1 :] {
6
+ if x > d [size ] {
7
+ size ++
8
+ d [size ] = x
9
+ } else {
10
+ left , right := 1 , size
11
+ for left < right {
12
+ mid := (left + right ) >> 1
13
+ if d [mid ] >= x {
14
+ right = mid
15
+ } else {
16
+ left = mid + 1
17
+ }
18
+ }
19
+ if d [left ] < x {
20
+ left = 1
21
+ }
22
+ d [left ] = x
23
+ }
24
+ }
25
+ return size
60
26
}
Original file line number Diff line number Diff line change 1
- class Solution {
2
- public int lengthOfLIS (int [] nums ) {
3
- TreeSet <Integer > ts = new TreeSet ();
4
- for (int v : nums ) {
5
- ts .add (v );
6
- }
7
- int idx = 1 ;
8
- Map <Integer , Integer > m = new HashMap <>();
9
- for (int v : ts ) {
10
- m .put (v , idx ++);
11
- }
12
- BinaryIndexedTree tree = new BinaryIndexedTree (m .size ());
13
- int ans = 1 ;
14
- for (int v : nums ) {
15
- int x = m .get (v );
16
- int t = tree .query (x - 1 ) + 1 ;
17
- ans = Math .max (ans , t );
18
- tree .update (x , t );
19
- }
20
- return ans ;
21
- }
22
- }
23
-
24
- class BinaryIndexedTree {
25
- private int n ;
26
- private int [] c ;
27
-
28
- public BinaryIndexedTree (int n ) {
29
- this .n = n ;
30
- c = new int [n + 1 ];
31
- }
32
-
33
- public void update (int x , int val ) {
34
- while (x <= n ) {
35
- c [x ] = Math .max (c [x ], val );
36
- x += lowbit (x );
37
- }
38
- }
39
-
40
- public int query (int x ) {
41
- int s = 0 ;
42
- while (x > 0 ) {
43
- s = Math .max (s , c [x ]);
44
- x -= lowbit (x );
45
- }
46
- return s ;
47
- }
48
-
49
- public static int lowbit (int x ) {
50
- return x & -x ;
51
- }
1
+ class Solution {
2
+ public int lengthOfLIS (int [] nums ) {
3
+ int n = nums .length ;
4
+ int [] d = new int [n + 1 ];
5
+ d [1 ] = nums [0 ];
6
+ int size = 1 ;
7
+ for (int i = 1 ; i < n ; ++i ) {
8
+ if (nums [i ] > d [size ]) {
9
+ d [++size ] = nums [i ];
10
+ } else {
11
+ int left = 1 , right = size ;
12
+ while (left < right ) {
13
+ int mid = (left + right ) >> 1 ;
14
+ if (d [mid ] >= nums [i ]) {
15
+ right = mid ;
16
+ } else {
17
+ left = mid + 1 ;
18
+ }
19
+ }
20
+ int p = d [left ] >= nums [i ] ? left : 1 ;
21
+ d [p ] = nums [i ];
22
+ }
23
+ }
24
+ return size ;
25
+ }
52
26
}
Original file line number Diff line number Diff line change 1
- class BinaryIndexedTree :
2
- def __init__ (self , n ):
3
- self .n = n
4
- self .c = [0 ] * (n + 1 )
5
-
6
- @staticmethod
7
- def lowbit (x ):
8
- return x & - x
9
-
10
- def update (self , x , val ):
11
- while x <= self .n :
12
- self .c [x ] = max (self .c [x ], val )
13
- x += BinaryIndexedTree .lowbit (x )
14
-
15
- def query (self , x ):
16
- s = 0
17
- while x :
18
- s = max (s , self .c [x ])
19
- x -= BinaryIndexedTree .lowbit (x )
20
- return s
21
-
22
-
23
- class Solution :
24
- def lengthOfLIS (self , nums : List [int ]) -> int :
25
- s = sorted (set (nums ))
26
- m = {v : i for i , v in enumerate (s , 1 )}
27
- tree = BinaryIndexedTree (len (m ))
28
- ans = 1
29
- for v in nums :
30
- x = m [v ]
31
- t = tree .query (x - 1 ) + 1
32
- ans = max (ans , t )
33
- tree .update (x , t )
34
- return ans
1
+ class Solution :
2
+ def lengthOfLIS (self , nums : List [int ]) -> int :
3
+ d = [nums [0 ]]
4
+ for x in nums [1 :]:
5
+ if x > d [- 1 ]:
6
+ d .append (x )
7
+ else :
8
+ idx = bisect_left (d , x )
9
+ if idx == len (d ):
10
+ idx = 0
11
+ d [idx ] = x
12
+ return len (d )
You can’t perform that action at this time.
0 commit comments