354. 俄罗斯套娃信封问题
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/russian-doll-envelopes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
class Solution {
private int search(List<Integer> arr, int target) {
int l = 0, r = arr.size() - 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (arr.get(mid) < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return l;
}
public int maxEnvelopes(int[][] envelopes) {
if (envelopes == null || envelopes.length == 0 || envelopes[0].length == 0) {
return 0;
}
Arrays.sort(envelopes, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return Integer.compare(o2[1], o1[1]);
}
return Integer.compare(o1[0], o2[0]);
}
});
List<Integer> dp = new ArrayList<>();
for (int[] envelope : envelopes) {
int index = search(dp, envelope[1]);
if (index == dp.size()) {
dp.add(envelope[1]);
} else {
dp.set(index, envelope[1]);
}
}
return dp.size();
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号