class Solution {
public int maxEnvelopes(int[][] envelopes) {
// 排序
Arrays.sort(envelopes, new Comparator<int[]>() {
// 按宽度升序排序,宽度一样时,按高度降序排序
// 以此保证在宽度相同的信封中最多只选取一个
public int compare(int[] a, int[] b) {
return a[0] == b[0] ? b[1] - a[1] : a[0] - b[0];
}
});
// 信封个数
int n = envelopes.length;
// 排序后高度构成的一维数组
int[] height = new int[n];
for (int i = 0; i < n; i++) {
height[i] = envelopes[i][1];
}
// 高度一维数组的最长递增子序列即为可套娃的信封个数
return lengthOfLIS(height);
}
// 辅助函数,求最长递增子序列的长度
public int lengthOfLIS(int[] nums) {
// dp[i] 即以 nums[i] 这个数结尾的最长递增子序列的长度
int dp[] = new int[nums.length];
// base case
// 以 nums[i] 这个数结尾的最长递增子序列至少包含自己本身 初始化为 1
Arrays.fill(dp, 1);
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
// 状态转移 当前下标 i 对应数值大于下标 j 对应数值才会得到更长的子序列 即 + 1 操作
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int ans = 0;
for (int i = 0; i < dp.length; i++) {
ans = Math.max(ans, dp[i]);
}
return ans;
}
}
leetcode-354-俄罗斯套娃信封问题
最新推荐文章于 2024-06-12 10:00:23 发布