leetcode:354 俄罗斯套娃信封问题(LIS)

解题思路:
根据题意,不难发现组合的元素,他们的长宽都是单调递增的,因此可以转化为最长上升子序列问题。
首先按照长度从小到大对信封进行排序,长度相同,按照宽度从大到小进行排序。因为当长度相同,因为可能会把相同长的信封当做长度不同的信封给装起来了,如果宽度从大到小排序,就不会出现覆盖长度相同的情况。
然后就是正常LIS方法,在coding的过程中,为了防止出现序列长度和信封长度相同的情况下出现保留了宽度较长的信封而没有保存宽度较短的信封,用了list存储结尾值,后来发现是没有必要的操作,因为不可能出现这种情况。。。
def maxEnvelopes(envelopes):
# dp[i]表示以第i个元素结尾的最长子序列长度
dp= [0]*len(envelopes)+[0]
# mx[j]表示长度为j的序列结尾值是多少,考虑到在信封的长度有可能重复,因此用list存储
mx =[[0]] + [[100000] for i in range(len(envelopes))]
# 按照长从小到大排,长度相同按照宽从大到小排
a = sorted(envelopes,key = lambda x:(x[0],-x[1])) #
length = len(a)
a = [[0, 0]] + a +[[0,0]]
#填充下标0,使元素从1开始算
for i in range(1,length+1):
#如果当前信封的长和上一个不同,说明已经处理完重复的信封了,后面的信封长度都比之前的长
#因此,根据最优解的依赖关系,我们仅需保留mx[j]中结尾值最小的元素
if a[i][0]!=a[i-1][0]:
xx = mx.index([100000]) #优化查询,降低时间复杂度,使得整体复杂度由N*N降低到N*logN
for j in range(xx,-1,-1):
mini = min(mx[j])
mx[j] = [mini]
xx = mx.index([100000]) #优化查询,降低时间复杂度,使得整体复杂度由N*N降低到N*logN
for j in range(xx,-1,-1):
flag =False
for k in mx[j]:
if a[i][1] > k: #只需要比mx[j]中某一个值大就可以构造成长度为j+1的子序列
dp[i] = j+1
mx[dp[i]].append(a[i][1])
flag = True
break
if flag:
break
#print(mx)
return max(dp)
1 简化版
2 class Solution(object):
3 def maxEnvelopes(self,envelopes):
4 # dp[i]表示以第i个元素结尾的最长子序列长度
5 dp= [0]*len(envelopes)+[0]
6 # mx[j]表示长度为j的序列结尾值是多少,考虑到在信封的长度有可能重复,因此用list存储
7 mx =[0] + [100000 for i in range(len(envelopes))]
8 # 按照长从小到大排,长度相同按照宽从大到小排
9 a = sorted(envelopes,key = lambda x:(x[0],-x[1])) #
10 length = len(a)
11 a = [[0, 0]] + a +[[0,0]]
12 #填充下标0,使元素从1开始算
13 for i in range(1,length+1):
14 xx = mx.index(100000) #优化查询,降低时间复杂度,使得整体复杂度由N*N降低到N*logN
15 for j in range(xx,-1,-1):
16 if a[i][1] > mx[j]:
17 dp[i] = j+1
18 mx[dp[i]]= min(mx[dp[i]],a[i][1])
19 break
20 #print(mx)
21 return max(dp)
leetcode:354 俄罗斯套娃信封问题(LIS)的更多相关文章
- Java实现 LeetCode 354 俄罗斯套娃信封问题
354. 俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一 ...
- leetcode 354. 俄罗斯套娃信封问题(二维排序有关)
题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多能有 ...
- Leetcode 354.俄罗斯套娃信封问题
俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计 ...
- 1、线性DP 354. 俄罗斯套娃信封问题
354. 俄罗斯套娃信封问题 https://leetcode-cn.com/problems/russian-doll-envelopes/ 算法分析 首先我们从两种情况来讨论这个问题: w无重复值 ...
- [Swift]LeetCode354. 俄罗斯套娃信封问题 | Russian Doll Envelopes
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...
- [LeetCode] 354. Russian Doll Envelopes 俄罗斯套娃信封
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...
- 第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS问题
Leetcode354 暴力的方法是显而易见的 O(n^2)构造一个DAG找最长链即可. 也有办法优化到O(nlogn) 注意 信封的方向是不能转换的. 对第一维从小到大排序,第一维相同第二维从大到小 ...
- leetCode 354. Russian Doll Envelopes
You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...
- leetcode@ [354] Russian Doll Envelopes (Dynamic Programming)
https://leetcode.com/problems/russian-doll-envelopes/ You have a number of envelopes with widths and ...
- LeetCode Longest Increasing Subsequence (LIS O(nlogn))
题意: 给一个数组,求严格递增的最长递增子序列的长度. 思路: 开销是一个额外的O(n)的数组.lower_bound(begin,end,val)的功能是:返回第一个大于等于val的地址. clas ...
随机推荐
- Python条件控制和循环语句(if while for )
Python条件控制和循环语句(if while for ) 条件控制 概念:Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块 结构 1. 顺序结构 ...
- 谈一谈电商api的未来
随着互联网的飞速发展,电商行业已经成为了现代消费的主流模式.在电商平台上,商品的交易.物流.支付等环节都需要使用API(Application Programming Interface)接口来实现信 ...
- Solidity-变量和数据类型[基本类型]
在solidity语言中,变量和数据类型分为三类:基本类型(bool.int.address等),复合类型(array.struct.mapping等)和特殊类型(enum.function.modi ...
- 3DMatch
详细描述链接:3DMatch 数据集.github(介绍非常详细) 官网主页: 主页 3DMatch数据集收集了来自于62个场景的数据,其中54个场景的数据用于训练,8个场景的数据用于评估,其具体名称 ...
- Vue源码学习(九):响应式前置:实现对象的依赖收集(dep和watcher)
好家伙,这是目前为止最绕的一章,也是十分抽象的一章 由于实在太过抽象,我只能用一个不那么抽象的实例去说服我自己 完整代码已开源https://github.com/Fattiger4399/ana ...
- C++算法之旅、09 力扣篇 | 常见面试笔试题(上)算法小白专用
刷题的目的是为了更好的理解数据结构与算法,更好的理解一些封装起来的库函数是怎么实现的,而不是简简单单的为了刷题而刷题. 时间.空间复杂度 事后统计法 提前写好算法代码和编好测试数据,在计算机上跑,通过 ...
- Jmeter调用Python脚本,实现参数互相传递
首先传值到python 1:新增取样器--->os进程取样器 2:新建.bat文件 (写python脚本的路径和传参的个数:思路是:jmeter调用shell,用shell执行py) F:cd ...
- np.random.beta
numpy.random.beta(a,b,size=None) 从β分布中提取样本.β分布是狄里克莱分布的一个特例,与伽马分布有关. 在这里我们将参数(3个参数)设置为32 32 3 参数1:32次 ...
- CF1534C
题目简化和分析: 涉及算法:并查集. 为什么要使用并查集: 因为交换只能是列交换,并且保证不与别的重复 我们通过观察题目发现,某些列之间互为限制关系 即如果某列序列排序方式固定,则被限制的列也为固定的 ...
- 算法修养--广度优先搜索BFS
广度优先算法(BFS) 广度优先算法(Breadth-First Search)是在图和树领域的搜索方法,其核心思想是从一个起始点开始,访问其所有的临近节点,然后再按照相同的方式访问这些临近节点的节点 ...