13 最大子数组和

最大子数组和

  • 本题适合动态规划的原因
    • [题解1 不标准动态规划(标准参考labuladong)](#题解1 不标准动态规划(标准参考labuladong))
    • [题解2 优化DP(前缀和)](#题解2 优化DP(前缀和))
    • [题解3 分治(有时间撸)](#题解3 分治(有时间撸))

本题适合动态规划的原因

本题接的重点在

  1. 理解题意

    题目只要求返回结果,不要求得到最大的连续子数组是哪一个,一般用DP解决

  2. 如何定义子问题 (如何定义状态)

    存在不确定性的子问题 like:(经过 ------ 位置不确定 ------ start end不确定)

    确定的子问题 like:

  3. 什么是 无后效性

    为了保证计算子问题能够按照顺序、不重复地进行,动态规划要求已经求解的子问题不受后续阶段 的影响。这个条件也被叫做无后效性 。换言之,动态规划对状态空间的遍历构成一张有向无环图 ,遍历就是该有向无环图的一个拓扑序。有向无环图中的节点对应问题中的状态 ,图中的边则对应状态之间的转移 ,转移的选取就是动态规划中的决策

题解1 不标准动态规划(标准参考labuladong)

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        const int s = nums.size();
        if(1 == s) return nums[0];
        // meaning : dp[i] : 以 nums[i]结尾的 最大子数组和 
        vector<int> dp(s);
        // base case
        dp[0] = nums[0];
        // 转移方程
        // 根据题意,i及 i以前的 可能的最大值 要么是nums[i]本身,要么是 i前最大的值 累加上 此位置的值
        // 不标准: dp[s-1]不是最后的结果
        for(int i=1; i < s; i++)
            dp[i] = max(nums[i], nums[i] + dp[i-1]);
        int maxV = INT_MIN;
        for(auto & i : dp){
            maxV = max(maxV, i);
        }
        return maxV;

    }
};

题解2 优化DP(前缀和)

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        const int s = nums.size();
        if(1 == s) return nums[0];
        int res = INT_MIN;
        int pre = 0;
        for(int i=0; i < s; i++){
            pre = max(nums[i], nums[i]+pre);
            res = max(res, pre);
        }     
        return res;
    }
};

题解3 分治(有时间撸)

不仅可以解决区间 [0,n−1][0, n-1][0,n−1],还可以用于解决任意的子区间 [l,r][l,r][l,r] 的问题。如果我们把 [0,n−1][0, n-1][0,n−1] 分治下去出现的所有子区间的信息都用堆式存储的方式记忆化下来,即建成一棵真正的树之后,我们就可以在 O(log⁡n) 的时间内求到任意区间内的答案,我们甚至可以修改序列中的值,做一些简单的维护,之后仍然可以在 O(log⁡n)的时间内求到任意区间内的答案,对于大规模查询的情况下,这种方法的优势便体现了出来。这棵树就是上文提及的一种神奇的数据结构------线段树

相关推荐
大数据张老师1 天前
数据结构——平衡二叉树
数据结构·算法·查找
py有趣1 天前
LeetCode算法学习之合并区间
学习·算法·leetcode
大数据张老师1 天前
数据结构——BF算法
数据结构·算法·1024程序员节
Yupureki1 天前
从零开始的C++学习生活 14:map/set的使用和封装
c语言·数据结构·c++·学习·visual studio·1024程序员节
一匹电信狗1 天前
【LeetCode_876_2.02】快慢指针在链表中的简单应用
c语言·数据结构·c++·算法·leetcode·链表·stl
胖咕噜的稞达鸭1 天前
算法入门---专题二:滑动窗口2(最大连续1的个数,无重复字符的最长子串 )
c语言·数据结构·c++·算法·推荐算法·1024程序员节
Yupureki1 天前
从零开始的C++学习生活 15:哈希表的使用和封装unordered_map/set
c语言·数据结构·c++·学习·visual studio·1024程序员节
码农多耕地呗1 天前
力扣543.二叉树的直径(java)(迭代法 and 左右根后序遍历迭代法)
算法·leetcode·职场和发展
yongui478341 天前
B树和B+树的解析应用
数据结构·b树·前端框架
Gorgous—l1 天前
数据结构算法学习:LeetCode热题100-链表篇(下)(随机链表的复制、排序链表、合并 K 个升序链表、LRU 缓存)
数据结构·学习·算法