当前位置:首页 > 力扣 > 力扣2771题解析:双数组动态规划求解最长非递减子数组问题

力扣2771题解析:双数组动态规划求解最长非递减子数组问题

2个月前 (06-27)

力扣2771题解析:双数组动态规划求解最长非递减子数组问题  动态规划 最长递增子序列 双数组DP 算法优化 第1张

一、题目解读

力扣2771题要求从两个整数数组nums1和nums2中合并元素,寻找最长非递减子数组的长度。非递减子数组指元素单调递增或相等的连续序列。题目难点在于需同时考虑两个数组的交互关系,找到全局最优解。

二、解题思路

动态规划(DP)策略。定义两个DP数组dp1[i]和dp2[i],分别表示以nums1[i]和nums2[i]结尾的最长非递减子数组长度。核心在于利用双数组处理两数组的交叉选择:每个位置可视为选择当前数组元素或延续另一数组的前缀结果。通过状态转移方程更新最大值,最终取dp1和dp2中的全局最大值。

三、解题步骤

1. 初始化:dp1和dp2初始值均为1(单个元素即合法子数组)。

2. 迭代处理:

    若nums1[i]≥nums1[i-1],则dp1[i]可延续dp1[i-1];

    若nums1[i]≥nums2[i-1],则dp1[i]可承接dp2[i-1](跨数组合并);

    同理处理dp2[i]的两种情况。

3. 全局更新:每次迭代后比较dp1[i]和dp2[i],取最大值存入max_len。

4. 返回结果:max_len即为最终答案。

四、代码与注释

class Solution {
public:
    int maxNonDecreasingLength(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        if (n == 0) return 0;
        
        // dp1[i]表示选择nums1[i]时的最长非递减子数组长度
        // dp2[i]表示选择nums2[i]时的最长非递减子数组长度
        vector<int> dp1(n, 1), dp2(n, 1);
        int max_len = 1;
        
        for (int i = 1; i < n; ++i) {
            // 当前选择nums1[i]的情况
            if (nums1[i] >= nums1[i-1]) {
                dp1[i] = max(dp1[i], dp1[i-1] + 1); // 延续nums1前缀
            }
            if (nums1[i] >= nums2[i-1]) {
                dp1[i] = max(dp1[i], dp2[i-1] + 1); // 跨数组合并
            }
            
            // 当前选择nums2[i]的情况
            if (nums2[i] >= nums1[i-1]) {
                dp2[i] = max(dp2[i], dp1[i-1] + 1);
            }
            if (nums2[i] >= nums2[i-1]) {
                dp2[i] = max(dp2[i], dp2[i-1] + 1); // 延续nums2前缀
            }
            
            // 更新全局最大值
            max_len = max(max_len, max(dp1[i], dp2[i]));
        }
        
        return max_len;
    }
};

五、总结

本解法通过双DP数组巧妙处理双数组交叉选择问题,时间复杂度O(n),空间复杂度O(n)。动态规划的关键在于明确状态定义和转移逻辑,适用于需要全局最优解且存在重叠子问题的场景。理解两数组元素的“可衔接性”是解题核心。

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

题意解析:给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数...

牛客12576题解题全解析:动态规划+质因数分解实现跳跃问题最优解

牛客12576题解题全解析:动态规划+质因数分解实现跳跃问题最优解

一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

一、题目解读洛谷P4551题要求在一个无向图中,寻找任意两点路径权值异或后的最大值。题目输入为图的边信息(点数n和n-1条边),每条边包含起点、终点及权值。需输出所有路径中权值异或的最大值。问题核心在...

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

2023年GESP五级题「因式分解」洛谷B3871算法解析与代码实现

一、题目解读2023年GESP五级题「因式分解」(洛谷B3871)要求将给定的大整数N分解为质因数的乘积形式,并输出每个质因数及其指数。题目考察核心算法为质因数分解,需高效处理大数分解,避免超时。难点...

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

一、题目解读力扣931题「Minimum Falling Path Sum」(最小下降路径和)要求在一个n x n的整数矩阵中,计算从顶部到底部的最小路径和。路径只能从每个位置向下或对角线移动(即向下...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。