ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 6206. 最长递增子序列 II

2022-09-12 11:31:01  阅读:80  来源: 互联网

标签:return nums int max tree II 6206 res LeetCode


本题思路是遍历一遍当前数组的元素,假设当前元素为i,f[i]是以元素i结尾的最长的递增子序列长度,那么f[i] = 1 + max(f[i-k], f[i-k+1],...,f[i-1])。核心问题就是如何在遍历每个元素时求出max(f[i-k], f[i-k+1],...,f[i-1]),如果使用普通的遍历,那么时间复杂度为\(O(n^2)\),会超时,因此可以使用线段树维护查询这个区间内的最大值,时间复杂度为\(O(nlogn)\)。参考这篇题解的代码线段树优化 DP

class Solution {
public:
    vector<int> tree;

    void modify(int o, int l, int r, int i, int val)
    {
        if(l == r)
        {
            tree[o] = val;
            return ;
        }
        int m = (l + r) / 2;
        if(i <= m) modify(o * 2, l, m, i, val);
        else modify(o * 2 + 1, m + 1, r, i, val);
        tree[o] = max(tree[o*2], tree[o*2+1]);
    }

    int query(int o, int l, int r, int L, int R)
    {
        if(l >= L && r <= R) return tree[o];
        int m = (l + r) / 2;
        int res = 0;
        if(m >= L) res = query(o * 2, l, m, L, R);
        if(m < R) res = max(res, query(o * 2 + 1, m + 1, r, L, R));
        return res;
    }

    int lengthOfLIS(vector<int>& nums, int k) {
        int u = *max_element(nums.begin(), nums.end());
        tree.resize(u * 4);
        for(int x: nums)
        {
            if(x == 1) modify(1, 1, u, 1, 1);
            else
            {
                int res = 1 + query(1, 1, u, max(1, x-k), x-1);
                modify(1, 1, u, x, res);
            }
        }
        return tree[1];
    }
};

标签:return,nums,int,max,tree,II,6206,res,LeetCode
来源: https://www.cnblogs.com/ambition-hhn/p/16685788.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有