300. 最长递增子序列
673 最长递增子序列
本题是「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();
}
};``