# 俄罗斯套娃信封问题

给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。

当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。

请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。

注意:不允许旋转信封。

 

示例 1:

输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

示例 2:

输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; ``` ### after ```cpp ``` ## 答案 ```cpp class Solution { public: static bool myCmp(pair &one, pair &two) { if (one.first == two.first) { return one.second <= two.second; } else { return one.first <= two.first; } } int maxEnvelopes(vector> &envelopes) { int result = 1; int envelopesSize = envelopes.size(); if (envelopesSize == 0) { return 0; } vector dp(envelopesSize, 1); sort(envelopes.begin(), envelopes.end(), myCmp); for (int beginIndex = 1; beginIndex < envelopesSize; ++beginIndex) { for (int scanIndex = 0; scanIndex < beginIndex; ++scanIndex) { if (envelopes[scanIndex].first <= envelopes[beginIndex].first) { dp[beginIndex] = max(dp[beginIndex], dp[scanIndex]); } } result = max(result, dp[beginIndex]); } return result; } }; ``` ## 选项 ### A ```cpp class Solution { public: int maxEnvelopes(vector> &envelopes) { sort(envelopes.begin(), envelopes.end(), [](const vector &a, const vector &b) { return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0]; }); vector dp; for (const auto &e : envelopes) { auto p = lower_bound(dp.begin(), dp.end(), e[1]); if (p == dp.end()) dp.push_back(e[1]); else *p = e[1]; } return dp.size(); } }; ``` ### B ```cpp class Solution { public: static bool judge(const pair a, const pair b) { if (a.first != b.first) { return a.first < b.first; } return a.second > b.second; } int get_cur_index(int *dp, int index, int value) { int left = 1; int right = index; while (left < right) { int mid = left + (right - left) / 2; if (value < dp[mid]) { right = mid; } else if (value > dp[mid]) { left = mid + 1; } else if (value == dp[mid]) { return mid; } } return left; } int maxEnvelopes(vector> &envelopes) { if (envelopes.empty()) { return 0; } vector> nums; for (int i = 0; i < envelopes.size(); i++) { nums.push_back(make_pair(envelopes[i][0], envelopes[i][1])); } sort(nums.begin(), nums.end(), this->judge); int dp[envelopes.size() + 1]; dp[1] = nums[0].second; int index = 1; for (int i = 1; i < nums.size(); i++) { if (nums[i].second > dp[index]) { dp[++index] = nums[i].second; } else { int new_index = get_cur_index(dp, index, nums[i].second); dp[new_index] = nums[i].second; } } return index; } }; ``` ### C ```cpp bool sortV(vector &a, vector &b) { if (a[0] == b[0]) return a[1] > b[1]; else return a[0] < b[0]; } class Solution { public: int maxEnvelopes(vector> &envelopes) { if (envelopes.empty()) return 0; sort(envelopes.begin(), envelopes.end(), sortV); int n = envelopes.size(); vector dp(n, 1); int ans = 1; for (int i = 1; i < envelopes.size(); i++) { for (int j = i - 1; j >= 0; j--) { if (envelopes[i][1] > envelopes[j][1]) { dp[i] = max(dp[i], dp[j] + 1); } } ans = max(ans, dp[i]); } return ans; } }; ```