300. 最长递增子序列

Leetcode每日一题(9.12)最长递增序列的个数_leetcode

673 最长递增子序列

Leetcode每日一题(9.12)最长递增序列的个数_算法_02

本题是「300. 最长递增子序列」的进阶版本,建议读者在掌握该题做法后继续阅读
实现代码:
参考官方题解
没有思路…
注意:
函数传递中:

function<bool(int)> f  //与匿名函数结合使用

int i = binarySearch(d.size(), [&](int i){ return d[i].back() >=v; });
class Solution {
public:
    int binarySearch(int n,function<bool(int)> f){
        int l= 0, r = n;
        while(l < r){
            int mid = (l+r)/2;
            if(f(mid)){
                r = mid;
            }else{
                l = mid + 1;
            }
        }
        return l;
    }

    int findNumberOfLIS(vector<int>& nums) {
        vector<vector<int>> d, cnt;
        for(int v : nums){
            int i = binarySearch(d.size(), [&](int i){ return d[i].back() >=v; });
            int c = 1;
            if(i > 0){
                int k = binarySearch(d[i-1].size(), [&](int k){return d[i-1][k] < v;});
                c = cnt[i - 1].back() - cnt[i-1][k];
            }
            if(i == d.size()){
                d.push_back({v});
                cnt.push_back({0,c});
            }else{
                d[i].push_back(v);
                cnt[i].push_back(cnt[i].back()+c);
            }
        }
        return cnt.back().back();
    }
};``