您的位置:首页 > 编程语言

354. Russian Doll Envelopes 超时。。。还是把代码贴出来吧

2016-07-28 22:47 330 查看
原题链接: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;

}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: