解题思路:

根据题意,不难发现组合的元素,他们的长宽都是单调递增的,因此可以转化为最长上升子序列问题。

首先按照长度从小到大对信封进行排序,长度相同,按照宽度从大到小进行排序。因为当长度相同,因为可能会把相同长的信封当做长度不同的信封给装起来了,如果宽度从大到小排序,就不会出现覆盖长度相同的情况。

然后就是正常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)的更多相关文章

  1. Java实现 LeetCode 354 俄罗斯套娃信封问题

    354. 俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一 ...

  2. leetcode 354. 俄罗斯套娃信封问题(二维排序有关)

    题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多能有 ...

  3. Leetcode 354.俄罗斯套娃信封问题

    俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计 ...

  4. 1、线性DP 354. 俄罗斯套娃信封问题

    354. 俄罗斯套娃信封问题 https://leetcode-cn.com/problems/russian-doll-envelopes/ 算法分析 首先我们从两种情况来讨论这个问题: w无重复值 ...

  5. [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 ...

  6. [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 ...

  7. 第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS问题

    Leetcode354 暴力的方法是显而易见的 O(n^2)构造一个DAG找最长链即可. 也有办法优化到O(nlogn) 注意 信封的方向是不能转换的. 对第一维从小到大排序,第一维相同第二维从大到小 ...

  8. 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 ...

  9. leetcode@ [354] Russian Doll Envelopes (Dynamic Programming)

    https://leetcode.com/problems/russian-doll-envelopes/ You have a number of envelopes with widths and ...

  10. LeetCode Longest Increasing Subsequence (LIS O(nlogn))

    题意: 给一个数组,求严格递增的最长递增子序列的长度. 思路: 开销是一个额外的O(n)的数组.lower_bound(begin,end,val)的功能是:返回第一个大于等于val的地址. clas ...

随机推荐

  1. SQL语句简单入门

    SQL语句速查 创建部门表 deptno dname location 1 技术部 23楼 create table dept --dept部门 ( deptno int primary key, - ...

  2. 万字长文教你实现华为云IoT+OpenHarmony智能家居开发

    本文分享自华为云社区<华为云IoT+OpenHarmony的智能家居开发>,作者:袁睿. 一.选题说明 1. 选题为基于OpenHarmony的智能家居,应用场景为户用,受益人群为住户. ...

  3. Python并发编程——paramiko远程控制的模块、病毒攻击原理、dll注入、

    文章目录 paramiko模块 作业 攻击原理解析 一.什么是dll 二.为何要有dll 什么是dll注入: 什么时候需要dll注入 dll注入的方法 使用SetWindowsHookEx函数对应用程 ...

  4. snowboy 无法 install

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple snowboy Looking in indexes: https://pypi.tun ...

  5. 爽。。。一键导出 MySQL 表结构,告别手动梳理表结构文档了。。。

    背景 系统需要交付,客户要求提供交维材料,包括系统的表结构,安排开发人员进行梳理,效率比较慢,遂自己花点时间捣鼓一下,发现有此插件,记录一下方便与同事分享 前提条件 必须有 go语言环境,有的话直接看 ...

  6. 归并排序 nO(lgn) 审核中

    大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我们在日常 ...

  7. 图形学、02 推导证明 | 任意一点经过透视投影后 z 坐标相对于之前有什么变化

    齐次坐标知识点: \(\begin{bmatrix} x \\ y \\ z \\ 1 \\\end{bmatrix} \Rightarrow\begin{bmatrix} nx \\ ny \\ n ...

  8. js下IE和FF的一些兼容写法总结

    一.脚本差异: 1.事件绑定:addEventListener 与 attachEvent  事件处理函数中this指向不同, IE中指向window 2.获取事件对象 :事件处理函数     win ...

  9. 网页全终端h5浏览器视频流解决方案RTSP/FLV/HLS

    背景 项目上需要基于视频巡检,在线勘查填写定制表单,降低巡检成本. 本文着重讲前端部分视频流展示解决方案. 调研 流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送 ...

  10. atest

    #include<iostream> using namespace std; int main() { reutrn 0; }