我是靠谱客的博主 狂野小鸽子,最近开发中收集的这篇文章主要介绍354. Russian Doll Envelopes 超时。。。还是把代码贴出来吧,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原题链接:https://leetcode.com/problems/russian-doll-envelopes/

思路比较笨。。。最开始想到的方法。

对每个信封比较大小,有大小区别的话,放到一个字典里,key是大的,value是小的,没有大小区别的话不操作,这一部分复杂度如果用无序哈希表的话,复杂度O(N2)。然后就是根据这个找最终结果,这一步复杂度不超过O(N2)。

最开始用的map,也就是红黑树,映射的时候有个logn复杂度,然后超时了。改用unordered_map以后,leetcode报错,required from 'struct std::__and_<std::__is_fast_hash<std::hash<std::pair<int, int> > >, std::__detail::__is_noexcept_hash<std::pair<int, int>, std::hash<std::pair<int, int> > > >'

暂时没搞懂为什么有这个错误。。。


以下是解法

class Solution {public://大小可以传递;不兼容的分在不同地方   搜索的时候可以减少复杂度

static int larger(pair<int, int> a, pair<int, int> b) {
if (a.first>b.first && a.second>b.second) return 1;
if (a.first<b.first && a.second<b.second) return 0;
return 2;
}
static int searchLocalMax(unordered_map<pair<int, int>, vector<pair<int, int>>> &l, map < pair<int, int>, int> &dp, pair<int, int> key) {//这个函数没有超时。为l的每个key寻找最大值
if (l.find(key) == l.end()) return 1;
auto smalles = l[key];
int curMax = 0;
int tmp;
for (int j = 0; j<smalles.size(); j++) {
if (dp[smalles[j]] != -1) {//
tmp = 1 + dp[smalles[j]];//
curMax = max(curMax, tmp);
}
else {
curMax = max(curMax, 1 + searchLocalMax(l, dp, smalles[j]));//这个递归没有超
}
}
dp[key] = max(1,curMax);//


return dp[key];
}
static int searchMax(unordered_map<pair<int, int>, vector<pair<int, int>>> &l, map< pair<int, int>, int> &dp) {
int maxE = 1;
for (auto i = l.begin(); i != l.end(); i++) {
auto key = (*i).first;
int tmp;
tmp = searchLocalMax(l, dp, key);
maxE = max(maxE, tmp);
}
return maxE;
}
int maxEnvelopes(vector<pair<int, int>>& envelopes) {
    if(envelopes.size()==0) return 0;
map<pair<int, int>, vector<pair<int, int>>> l;//a:[b,c] -> a > b,c
map<pair<int, int>, int> dp;
for (int i = 0; i<envelopes.size(); i++) {
dp[envelopes[i]] = -1;
vector<pair<int, int>> tmp;
l[envelopes[i]] = tmp;
}
for (int i = 0; i<envelopes.size(); i++) {
for (int j = i + 1; j<envelopes.size(); j++) {
if (larger(envelopes[i], envelopes[j]) == 1) {
l[envelopes[i]].push_back(envelopes[j]);
}
// if (larger(envelopes[i], envelopes[j]) == 2) continue;
if (larger(envelopes[i], envelopes[j]) == 0) {
l[envelopes[j]].push_back(envelopes[i]);
}


}
}
//map建立完以后,在里面搜索最长的
// vector<int> dp(envelopes.size(),-1);

return searchMax(l, dp);
    //return 0;
}
};

最后

以上就是狂野小鸽子为你收集整理的354. Russian Doll Envelopes 超时。。。还是把代码贴出来吧的全部内容,希望文章能够帮你解决354. Russian Doll Envelopes 超时。。。还是把代码贴出来吧所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部