LeetCode 354 Russian Doll Envelopes (动态规划)
时间:2022-07-23
本文章向大家介绍LeetCode 354 Russian Doll Envelopes (动态规划),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一道好题目,把最长递增子序列扩展到二维,但是这道题和最长递增子序列是有区别的,它不要求是序列,只是在数组中找到一组最长的组合,不要求顺序在初始中相同。
这是个二维的最长递增子序列,由于没有顺序限制,所以我们把第一维进行排序,然后对第二维进行动态规划
接下来就和最长递增子序列的思路一样: 效率是O(n^2)的算法,
struct Node
{
int x;
int y;
Node(){}
Node(int x,int y)
{
this->x = x;
this->y = y;
}
}a[100005];
int dp[100005];
int compare1(Node a,Node b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int compare2(Node a,Node b)
{
if(a.x<b.x && a.y<b.y)
return 1;
return 0;
}
int pos;
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
pos=0;
for(int i=0;i<envelopes.size();i++)
{
a[pos++] = Node(envelopes[i][0],envelopes[i][1]);
}
sort(a,a+pos,compare1);
int res=0;
for(int i=0;i<pos;i++)
{
dp[i]=1;
for(int j=i-1;j>=0;j--)
{
if(compare2(a[j],a[i]))
{
dp[i]=max(dp[i],dp[j]+1);
}
}
res = max(res,dp[i]);
}
return res;
}
};
最长递增序列,还有一种O(nlogn)的解法,这道题目也有同样的解法。 但是这种解法里给第一维排序的时候,第二维也要顺道排一下,在第一维相同的情况,第二维排倒序,然后再去动态规划, 这是因为,根据O(nlogn)的解法,我们需要维护一个第二维的递增数组,在第一维相同的而情况,第二维越小越小,在不断往递增数组里插入的时候,很明显第二维倒序会非常符合题目要求,并且减少很多不必要的判断
struct Node
{
int x;
int y;
Node(){}
Node(int x,int y)
{
this->x = x;
this->y = y;
}
}a[100005];
int dp[100005];
int compare(Node a,Node b)
{
if(a.x==b.x)
return a.y>b.y;
return a.x<b.x;
}
int pos;
int len;
int binarySearch(int x)
{
int l=0;
int r=len-1;
while(l<=r)
{
int mid = (l+r)/2;
if(x > dp[mid])
{
l = mid+1;
}
else
{
r = mid-1;
}
}
return l;
}
int last;
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
pos=0;
for(int i=0;i<envelopes.size();i++)
{
a[pos++] = Node(envelopes[i][0],envelopes[i][1]);
}
sort(a,a+pos,compare);
return fun();
}
int fun()
{
len = 0;
for(int i=0;i<pos;i++)
{
int index = binarySearch(a[i].y);
dp[index] = a[i].y;
if(index==len)
len++;
}
return len;
}
};
- Codeforces 719B Anatoly and Cockroaches
- 【一起学Python】爬取前程无忧招聘信息并写入Excel
- 【一起学Python】爬取网易云歌词
- Hadoop离线数据分析平台实战——370外链信息分析Hadoop离线数据分析平台实战——370外链信息分析
- POJ 1067 取石子游戏
- 【一起学Python】STEAM游戏评测爬虫
- Open Judge 2750 鸡兔同笼
- POJ 1017 Packets
- Hadoop离线数据分析平台实战——380MapReduce程序优化Hadoop离线数据分析平台实战——380MapReduce程序优化
- 配置远程访问Jupyter+腾讯云超划算活动上车
- HDU 4256 The Famous Clock
- ZOJ 1403&&HDU 1015 Safecracker【暴力】
- Torch7搭建卷积神经网络详细教程
- 爬虫入门到精通-HTTP协议的讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法