上一题LeetCode *300. 最长递增子序列用归纳法求出了一维数组的最长子序列问题,本题是二维数组,可以先排序然后转换成一维数组问题,再套用上一题解法即可。
排序: 以宽或高为基准(这里以宽为基准)排序,从小到大排。如果遇到相同的则比较高,小的在后面(因为宽相同就无法装进去,如果小的在前面那么就会出现宽一样的信封被装了进去),然后再对高进行最长自增子序列解法即可。
排序要对sort加一个cmp:return arr[0] == brr[0] ? brr[1] < arr[1] : arr[0] < brr[0];
class Solution {
public:
static bool cmp(vector<int> arr, vector<int> brr) {
return arr[0] == brr[0] ? brr[1] < arr[1] : arr[0] < brr[0];
}
int maxEnvelopes(vector<vector<int>>& envelopes) {
int res = 1;
sort(envelopes.begin(), envelopes.end(), cmp);
vector<int> dp(envelopes.size(), 1);
for (int i = 0; i < envelopes.size(); i++) {
for (int j = 0; j < i; j++) {
if (envelopes[i][3] > envelopes[j][4]) {
dp[i] = max(dp[i], dp[j] + 1);
res = max(res, dp[i]);
}
}
}
return res;
}
};