题目描述
给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)
题意:
直接暴力会超时
应该用二分+贪心
题解:
class Solution {
public:
/** * retrun the longest increasing subsequence * @param arr int整型vector the array * @return int整型vector */
vector<int> LIS(vector<int>& arr) {
// write code here
int n = arr.size();
if (n < 2) return arr;
int ans = 0;
vector<int> ret(n);
vector<int> st;
for (int i = 0; i < n; i++){
if (st.size() == 0 || arr[i] > st.back()){
st.push_back(arr[i]);
ret[i] = ++ans;
}
else{
int l = 0, h = ans-1;
while (l < h){
int m = (l+h)/2;
if (st[m] < arr[i]) l = m+1;
else h = m;
}
st[h] = arr[i];
ret[i] = h+1;
}
}
vector<int> res(ans);
for (int i = n-1; i >= 0; i--){
if (ret[i] == ans){
res[--ans] = arr[i];
}
}
return res;
}
};