-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy path1035.uncrossed-lines.py
39 lines (35 loc) · 1.16 KB
/
1035.uncrossed-lines.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#
# @lc app=leetcode id=1035 lang=python3
#
# [1035] Uncrossed Lines
#
# @lc code=start
# TAGS: Array, Dynamic Programming
# REVIEWME: Needleman–Wunsch algorithm
class Solution:
"""
Things to be careful about:
Copy list like this `prev = cur[:]` not `prev = cur`
Index of i and j (+-1)z
"""
# 256 ms, 53.05% . Time and Space: O(N^2)
def maxUncrossedLines(self, A: List[int], B: List[int]) -> int:
grid = [[0] * (len(B) + 1) for _ in range(len(A) + 1)]
for i in range(len(A)):
for j in range(len(B)):
if A[i] == B[j]:
grid[i][j] += 1
grid[i + 1][j + 1] = max(grid[i][j], grid[i][j+1], grid[i+1][j])
return grid[-1][-1]
# 204 ms, 91.78% . Time: O(N^2). Space: O(N)
def maxUncrossedLines(self, A: List[int], B: List[int]) -> int:
prev = [0] * (len(B) + 1)
cur = [0] * (len(B) + 1)
for i in range(len(A)):
for j in range(len(B)):
if A[i] == B[j]:
prev[j] += 1
cur[j + 1] = max(prev[j], prev[j+1], cur[j])
prev = cur[:]
return cur[-1]
# @lc code=end