Leetcode354。2次元の入れ子の問題(1次元のLISに変換)

意味:
与えられたnnグループnのリーダーはaia_iですa、幅はbi b_ibai <aj a_i <a_jの場合、赤い封筒a<aJbi <bj b_i <b_jb<bJ、次に赤い封筒iiは赤い封筒jjにインストールすることができますj次に、一度に最大でいくつの赤い封筒を入れ子にすることができるかを尋ねます。
データ範囲:1≤n≤105、1≤ai、bi≤109 1 \ leq n \ leq 10 ^ 5,1 \ leq a_i、b_i \ leq 10 ^ 91n1 051ab1 09

解決策:
最初の次元aaを昇順で検討します2番目の次元のabbbは再びドゥLISを。ここでの問題は、同じaaが存在する可能性があることです互いにネストされ赤い封筒。これは要件に沿っていないため、2番目の次元bbがあります。bは降順でソートされ、各ディメンションaaが確実になります。Aは多くても1つしか選択できません。

コード:

const int N = 100010;
struct Node {
    
    
    int w, h;
    bool operator < (const Node &A) const {
    
    
        if(w == A.w) return h > A.h;
        return w < A.w;
    }
}a[N];
int t[N], tg;

int b_s(int l, int r, int x) {
    
    
    while(l < r) {
    
    
        int mid = l + r >> 1;
        if(a[t[mid]].h >= x) r = mid;
        else l = mid + 1;
    }
    return l;
}

class Solution {
    
    
public:
    int maxEnvelopes(vector<vector<int>>& env) {
    
    
        int n = 0;
        for(auto &u : env) a[++n] = {
    
    u[0], u[1]};
        if(n == 0) return 0;
        
        sort(a + 1, a + n + 1);
        
        tg = 0;
        t[++tg] = 1;
        for(int i = 2; i <= n; ++i) {
    
    
            if(a[i].h > a[t[tg]].h) t[++tg] = i;
            else if(a[i].h < a[t[tg]].h) t[b_s(1, tg, a[i].h)] = i;
        }
        
        return tg;
    }
};

おすすめ

転載: blog.csdn.net/weixin_43900869/article/details/114345000