题解 | Redraiment的走法

Redraiment的走法

https://www.nowcoder.com/practice/24e6243b9f0446b081b1d6d32f2aa3aa

#include<iostream>
#include<vector>
using namespace std;

int biSearch(int x, vector<int>& dp) { //二分查找函数
    int left = 0, right = dp.size(), mid;
    while (left <= right) {
        mid = (right + left) / 2;
        if (dp[mid] >= x)
            right = mid - 1;
        else
            left = mid + 1;
    }
    return left;
}
int lis(vector<int>& arr) {
    vector<int> len; //设置数组长度大小的动态规划辅助数组
    vector<int> dp;//用于二分划分的辅助数组
    dp.push_back(arr[0]);
    len.push_back(1);
    for (int i = 1; i < arr.size(); i++) {
        if (arr[i] > dp[dp.size() - 1]) {
            dp.push_back(arr[i]);
            len.push_back(dp.size());
        } else {
            int t = biSearch(arr[i],
                             dp); //二分查找,找到第一个大于arr[i]的dp位置
            dp[t] = arr[i];
            len.push_back(t + 1);
        }
    }
    return dp.size();
}

int main() {
    int n;
    while (cin >> n) {
        vector<int> arr(n);
        for (int i = 0; i < n; i++) //输入
            cin >> arr[i];
        cout << lis(arr) << endl; //计算最长递增子序列长度
    }
    return 0;
}

全部评论

相关推荐

09-01 10:50
已编辑
东华大学 C++
PDD校招_内推:拼多多意向和开奖一般都比较晚,可能10月11月才出意向
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
08-20 19:41
那一天的Java_J...:简历完全流水账,学生思维很严重,还有很大的优化空间,可以多看看牛客的简历。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务