牛客题霸 [ 最长递增子序列] C++题解/答案
题目描述
给定数组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 hereint 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;}
};