最长上升子序列问题
300 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。
435 无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
646 最长数对链
给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。
452. 用最少数量的箭引爆气球
673. 最长递增子序列的个数
354 俄罗斯信封套娃
"""
这种些写法会超时 注意 dp[i] = max(dp[i], 1 + dp[j])
"""
class Solution:
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
if len(envelopes) <= 1:
return len(envelopes)
envelopes.sort(key=lambda x: (x[0], -x[1])) # 注意二维排序规则
dp = [1] * len(envelopes)
max_cnt = 1
for i in range(1, len(envelopes)):
for j in range(i-1, -1, -1):
if envelopes[i][1] > envelopes[j][1]:
dp[i] = max(dp[i], 1 + dp[j])
max_cnt = max(max_cnt, dp[i])
return max_cnt
"""
先判断大小 在赋值 比使用 max() 效率高
"""
class Solution:
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
if len(envelopes) <= 1:
return len(envelopes)
envelopes.sort(key=lambda x: (x[0], -x[1]))
dp = [1] * len(envelopes)
max_cnt = 1
for i in range(1, len(envelopes)):
for j in range(i-1, -1, -1):
if envelopes[i][1] > envelopes[j][1] and dp[j] + 1 > dp[i]:
dp[i] = 1 + dp[j]
max_cnt = max(max_cnt, dp[i])
return max_cnt