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();
    }
}
posted @ 2022-01-06 14:56  Tianyiya  阅读(32)  评论(0)    收藏  举报