1. var maxEnvelopes = function(envelopes) {
    2. if (envelopes.length === 0) {
    3. return 0;
    4. }
    5. const n = envelopes.length;
    6. envelopes.sort((e1, e2) => {
    7. if (e1[0] !== e2[0]) {
    8. return e1[0] - e2[0];
    9. } else {
    10. return e2[1] - e1[1];
    11. }
    12. })
    13. const f = new Array(n).fill(1);
    14. let ans = 1;
    15. for (let i = 1; i < n; ++i) {
    16. for (let j = 0; j < i; ++j) {
    17. if (envelopes[j][1] < envelopes[i][1]) {
    18. f[i] = Math.max(f[i], f[j] + 1);
    19. }
    20. }
    21. ans = Math.max(ans, f[i]);
    22. }
    23. return ans;
    24. };
    var maxEnvelopes = function(envelopes) {
        if (envelopes.length === 0) {
            return 0;
        }
    
        const n = envelopes.length;
        envelopes.sort((e1, e2) => {
            if (e1[0] - e2[0]) {
                return e1[0] - e2[0];
            } else {
                return e2[1] - e1[1];
            }
        })
    
        const f = [envelopes[0][1]];
        for (let i = 1; i < n; ++i) {
            const num = envelopes[i][1];
            if (num > f[f.length - 1]) {
                f.push(num);
            } else {
                const index = binarySearch(f, num);
                f[index] = num;
            }
        }
        return f.length;
    }
    
    const binarySearch = (f, target) => {
        let low = 0, high = f.length - 1;
        while (low < high) {
            const mid = Math.floor((high - low) / 2) + low;
            if (f[mid] < target) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        return low;
    };