class Solution {
public:
vector<int> LIS(vector<int>& arr) {
int len = 1, n = (int)arr.size();
if (n == 0) {
return {};
}
vector<int> d(n + 1, 0), p(n);
d[len] = arr[0];
p[0] = 1;
for (int i = 1; i < n; ++i) {
if (arr[i] > d[len]) {
d[++len] = arr[i];
p[i] = len;
} else {
int l = 1, r = len, pos = 0; // 如果找不到说明所有的数都比 nums[i] 大,此时要更新 d[1],所以这里将 pos 设为 0
while (l <= r) {
int mid = (l + r) >> 1;
if (d[mid] < arr[i]) {
pos = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
d[pos + 1] = arr[i];
p[i] = pos + 1;
}
}
vector<int> ans(len);
for(int i = n - 1, j = len; i>=0; i--){
//逆向找到第一个满足所需大小的数
if(p[i] == j){
ans[j-1] = arr[i];//填入后继续寻找下一个数
j = j-1;
}
}
return ans;
}
};