Skip to content

Commit 6176166

Browse files
committedApr 10, 2022
feat: update solutions to lc problem: No.0300
No.0300.Longest Increasing Subsequence
1 parent 1f6e6bd commit 6176166

File tree

6 files changed

+81
-198
lines changed

6 files changed

+81
-198
lines changed
 

‎solution/0300-0399/0300.Longest Increasing Subsequence/README.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ class Solution:
134134
```python
135135
class Solution:
136136
def lengthOfLIS(self, nums: List[int]) -> int:
137-
n = len(nums)
138137
d = [nums[0]]
139138
for x in nums[1:]:
140139
if x > d[-1]:
@@ -481,8 +480,7 @@ func max(a, b int) int {
481480

482481
```go
483482
func lengthOfLIS(nums []int) int {
484-
n := len(nums)
485-
d := make([]int, n+1)
483+
d := make([]int, len(nums)+1)
486484
d[1] = nums[0]
487485
size := 1
488486
for _, x := range nums[1:] {

‎solution/0300-0399/0300.Longest Increasing Subsequence/README_EN.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ Greedy & Binary search:
6969
```python
7070
class Solution:
7171
def lengthOfLIS(self, nums: List[int]) -> int:
72-
n = len(nums)
7372
d = [nums[0]]
7473
for x in nums[1:]:
7574
if x > d[-1]:
@@ -414,8 +413,7 @@ Greedy & Binary search:
414413

415414
```go
416415
func lengthOfLIS(nums []int) int {
417-
n := len(nums)
418-
d := make([]int, n+1)
416+
d := make([]int, len(nums)+1)
419417
d[1] = nums[0]
420418
size := 1
421419
for _, x := range nums[1:] {
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,18 @@
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+
}
4918
};
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,26 @@
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
6026
}
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,26 @@
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+
}
5226
}
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,12 @@
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)

0 commit comments

Comments
 (0)