題目描述
給定數組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;
}
};