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 ...
随机推荐
- codeforces600E. Lomsat gelral(dsu on tree笔记)
知识前驱:树链剖分 codeforces600E. Lomsat gelral 题意:给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和 分析:递归求解,对于一棵树,求出他的所有子树的颜色编号 ...
- QA|ValueError: write to closed file报错怎么debug|IHRM接口自动化测试
unittest生成自动化测试报告时报错ValueError: write to closed file,如下图 代码如下: 原因排查:因为with open打开文件后会自动关闭,也就是上图16行执行 ...
- from my mac
hello
- Chrome 手机端网页如何使用开发者模式
chrome 手机端网页如何调试 在Chrome手机端,你可以使用Chrome开发者工具来调试网页.下面是一些步骤: 首先,确保你的手机已经开启开发者模式.打开USB调试功能或可以通过USB连接或无线 ...
- 【matplotlib基础】--样式表
Matplotlib库 由于诞生的比较早,所以其默认的显示样式很难符合现在的审美,这也是它经常为人诟病的地方. 不过,经过版本更迭之后,现在 Matplotlib 已经内置了很多样式表,通过使用不同的 ...
- 低代码平台如何借助Nginx实现网关服务
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在典型的系统部署架构中,应用服务器是一种软件或硬件系统, ...
- 10. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP内网穿透支持修改头信息
用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP内网穿透支持修改头信息 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy ...
- Python+Softmax+MNIST
# -*- coding: utf-8 -*- """ 用神经网络搭建的softmax线性分离器 Softmax是用于分类过程,用来实现多分类的,简单来说,它把一些输出的 ...
- 🎊OpenTiny Vue 3.11.0 发布:增加富文本、ColorPicker等4个新组件,迎来了贡献者大爆发!
你好,我是 Kagol. 非常高兴跟大家宣布,2023年10月24日,OpenTiny Vue 发布了 v3.11.0 . OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,8.14 ...
- 高效技巧揭秘:Java轻松批量插入或删除Excel行列操作
摘要:本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在职场生活中,对Excel工作表的行和列进行操作是非常普遍的需求 ...