1. 程式人生 > 其它 >354. 俄羅斯套娃信封問題

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();
    }
}
心之所向,素履以往 生如逆旅,一葦以航