这道题有意思,其实就是300题的二维版本

    用二维的做法做了之后才发现原来这道题可以简化为一维版本
    二维

    1. static bool myfunc(vector<int> a, vector<int> b)
    2. {
    3. if(a[0] < b[0] && a[1] && b[1])
    4. return true;
    5. else
    6. return a[0] < b[0];
    7. }
    8. class Solution {
    9. public:
    10. int maxEnvelopes(vector<vector<int>>& envelopes) {
    11. int n = envelopes.size();
    12. if(!n) return 0;
    13. vector<vector<vector<int>>> tail;
    14. sort(envelopes.begin(), envelopes.end(), myfunc);
    15. for(int i = 0; i < n; i++)
    16. {
    17. if(!tail.size())
    18. {
    19. tail.push_back({});
    20. tail[0].push_back(envelopes[i]);
    21. continue;
    22. }
    23. bool b = false;
    24. for(auto x: tail.back())
    25. {
    26. if(envelopes[i][0] > x[0] && envelopes[i][1] > x[1])
    27. {
    28. tail.push_back({});
    29. tail[tail.size() - 1].push_back(envelopes[i]);
    30. b = true;
    31. break;
    32. }
    33. }
    34. if(b) continue;
    35. int l = 0, r = tail.size() - 1;
    36. while(l < r)
    37. {
    38. int mid = (l + r) >> 1;
    39. bool b = false;
    40. for(auto x: tail[mid])
    41. {
    42. if(envelopes[i][0] > x[0] && envelopes[i][1] > x[1])
    43. {
    44. l = mid + 1;
    45. b = true;
    46. break;
    47. }
    48. }
    49. if(!b)
    50. r = mid;
    51. }
    52. if(l < tail.size()) {
    53. tail[l].push_back(envelopes[i]);
    54. }
    55. }
    56. return tail.size();
    57. }
    58. };

    一维

    static bool myfunc(vector<int> a, vector<int> b)
    {
       if(a[0] == b[0])
           return a[1] > b[1];
       else
           return a[0] < b[0];
    }
    class Solution {
    public:
       int maxEnvelopes(vector<vector<int>>& envelopes) {
           sort(envelopes.begin(), envelopes.end(), myfunc);
           vector<int> h;
           for(auto x: envelopes)
           {
               h.push_back(x[1]);
           }
           vector<int> tail;
           for(auto x: h)
           {
               if(!tail.size() || x > tail.back())
               {
                   tail.push_back(x);
                   continue;
               }
               int l = 0, r = tail.size() - 1;
               while(l < r)
               {
                   int mid = (l + r + 1) >> 1;
                   if(x <= tail[mid])
                       r = mid - 1;
                   else
                       l = mid;
               }
               if(x > tail[l])
               {
                   tail[l + 1] = min(tail[l + 1], x);
               }
               else
               {
                   tail[l] = x;
               }
           }
           return tail.size();
       }
    };
    

    第二次写题

    class Solution {
        static bool fcSort(vector<int> a, vector<int> b)
        {
            if(a[0] != b[0]) return a[0] < b[0];
            else return a[1] > b[1];
        }
    public:
        int maxEnvelopes(vector<vector<int>>& envelopes) {
            if(!envelopes.size()) return 0;
    
            sort(envelopes.begin(), envelopes.end(), fcSort);
            vector<int> aTail;
            vector<int> aLen(envelopes.size(), 1);
            for(int i = 0; i < envelopes.size(); i++)
            {
                if(!aTail.size() || envelopes[aTail.back()][1] < envelopes[i][1])
                {
                    aTail.push_back(i);
                    aLen[i] = aTail.size();
                }
                else{
                    int l = 0, r = aTail.size() - 1;
                    while(l < r)
                    {
                        int mid = (l + r) >> 1;
                        if(envelopes[aTail[mid]][1] >= envelopes[i][1])
                            r = mid;
                        else
                            l = mid + 1;
                    }
                    aLen[i] = aLen[aTail[r]];
                    aTail[r] = i;
                }
            }
            return aTail.size();
        }
    };