354. 俄羅斯套娃信封問題
阿新 • • 發佈:2022-01-06
給你一個二維整數陣列 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(); } }