博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 俄罗斯套娃信封问题
阅读量:5891 次
发布时间:2019-06-19

本文共 1446 字,大约阅读时间需要 4 分钟。

对于我这种没有DP思维的想这种问题实在太难,看了下题解再去补了下LCS和LIS,发现还是不太会。最主要是二维的东西,一个被另一个所牵制。

解法:很直观的想法就是利用pair的性质把这个数组排个序,此时第一个已经是递增的了,然后按照第二个递增来做。但是这样并没有办法解决第一个牵制的问题,就比如1 1,1 2, 1 3,如果只看到第二维1 2 3而没有看到第一维1 1 1的相同性,就没办法得到正确的答案。此时怎么办呢?

  上面的问题在于在first相同的情况下,却仍然存在递增的情况,使得答案不准确。如果我们把第二维按照降序排列,也就是变成3 3, 3 2, 3 1,这样看着3 2 1,就可以很好判断出最长递增序列长度为1了。但是如果有个1 1,那3 1就会顶掉1 1,此时就会是1 3 -> 1 2 -> 1 2,第二次的1 2的1是由3 1的1得到来的。由于有1 1的存在,所以在最前面创建了一个位置,后面即使顶掉也无所谓,你可以认为就仍在是1 1,也可以认为是3 1,反正后面的firts肯定比3要大。

bool cmp(pair
a, pair
b) { if(a.first != b.first) return a.first < b.first; return a.second > b.second;}class Solution {public: int maxEnvelopes(vector
>& envelopes) { int n = envelopes.size(); if(!n) return 0; sort(envelopes.begin(), envelopes.end(), cmp); vector
dp, dp_2; dp.push_back(envelopes[0].second); dp_2.push_back(envelopes[0].first); for(int i = 1; i < n; ++i) { int p = lower_bound(dp.begin(), dp.end(), envelopes[i].second) - dp.begin(); if(p == dp.size()) { dp.push_back(envelopes[i].second); dp_2.push_back(envelopes[i].first); } else { dp[p] = envelopes[i].second; dp_2[p] = envelopes[i].first; } } return dp.size(); }};

 

转载于:https://www.cnblogs.com/llzhh/p/10191162.html

你可能感兴趣的文章
WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口...
查看>>
Linux资料收集贴(Vi命令集,Linux命令集)
查看>>
git 对比两个commit 之间的差异
查看>>
DDD 应对具体业务场景,Domain Model 重新设计
查看>>
SQL Server 存储字符数较大字段的问题
查看>>
FullText Search
查看>>
服务器备份攻略
查看>>
也做SQL查询:班级总成绩 前三名,总成绩有相等的情况
查看>>
NeHe OpenGL教程 第四十课:绳子的模拟
查看>>
ajax:数据传输方式简介
查看>>
FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码
查看>>
begineer2
查看>>
Oracle免客户端For .Net(只为用NewLife.XCode开发Oracle的同学服务)
查看>>
NVelocity标签设置缓存的解决方案
查看>>
学习Nutch不错的系列文章
查看>>
IIS配置PHP环境(快速最新版)
查看>>
EBS 中FND_STATS和dbms_stats区别
查看>>
AngularJs中,如何在render完成之后,执行Js脚本
查看>>
Windows Mobile下Native C++访问SqlCe的封装
查看>>
malloc/free函数的简单实现及思考
查看>>