C语言力扣刷题13——最大子数组和[线性动态规划]

C语言力扣刷题13------最大子数组和线性动态规划

一、博客声明

  找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解题思路,开辟这个系列来记录。代码可能不是自己写的,不求方法最好,只求更多地理解大佬们的解题思路。


二、题目描述

  给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。

示例 1:

复制代码
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

复制代码
输入:nums = [1]
输出:1

示例 3:

复制代码
输入:nums = [5,4,-1,7,8]
输出:23

提示:

复制代码
1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4

三、解题思路

1、思路说明

  这个题目只考虑找到众多子数组中求和的最大值即可,其实不用关注这个子数组的起点和终点在什么位置。我们只需要知道到数组第i个元素时,求和的最大值就可以。

举个例子:

  • [-2, 1]

    1. 到第0个元素时,求和的最大值为-2,用一个变量total记录下来,total = -2
    2. 到第1个元素时,就需要看它与前面之和加起来total + nums[1]和它自己本身nums[1]大,然后更新total = fmax(total + nums[1], nums[1]),其中total就是到当前位置,前面能累加到的最大值。
  • [-2, 1, -3]

    1. 到第0个元素时,求和的最大值为-2,用一个变量total记录下来,total = -2
    2. 到第1个元素时,就需要看它与前面之和加起来total + nums[1]和它自己本身nums[1]大,然后更新total = fmax(total + nums[1], nums[1]),其中total就是到当前位置,前面能累加到的最大值,total = 1
    3. 到第2个元素时,就需要看它与前面之和加起来(-2)和它自己本身(-3)大,因此更新后的 total = -2
  • [-2, 1, -3, 4]

    1. 到第0个元素时,求和的最大值为-2,用一个变量total记录下来,total = -2
    2. 到第1个元素时,就需要看它与前面之和加起来total + nums[1]和它自己本身nums[1]大,然后更新total = fmax(total + nums[1], nums[1]),其中total就是到当前位置,前面能累加到的最大值,total = 1
    3. 到第2个元素时,就需要看它与前面之和加起来(-2)和它自己本身(-3)大,因此更新后的 total = -2
    4. 到第3个元素时,就需要看它与前面之和加起来(2)和它自己本身(4)大,因此更新后的 total = 4
  • [-2, 1, -3, 4, -1]

    1. 到第0个元素时,求和的最大值为-2,用一个变量total记录下来,total = -2
    2. 到第1个元素时,就需要看它与前面之和加起来total + nums[1]和它自己本身nums[1]大,然后更新total = fmax(total + nums[1], nums[1]),其中total就是到当前位置,前面能累加到的最大值,total = 1
    3. 到第2个元素时,就需要看它与前面之和加起来(-2)和它自己本身(-3)大,因此更新后的 total = -2
    4. 到第3个元素时,就需要看它与前面之和加起来(2)和它自己本身(4)大,因此更新后的 total = 4
    5. 到第3个元素时,就需要看它与前面之和加起来(3)和它自己本身(-1)大,因此更新后的 total = 3

从上面就可以知道,total可以保存到第i个位置时能累加到的最大值,都不用管他是从哪个位置开始累加的。因此我们只需要找到total的最大值就可以了。

解释起来非常的牵强,还是得多练


四、解题代码(附注释)

c 复制代码
int maxSubArray(int* nums, int numsSize){    
    int ret = nums[0], total = 0;
    for(int i =0; i < numsSize; i++){
        total = fmax(total + nums[i], nums[i]); //total就是dp,代表第i个元素累加的最大值
        ret = fmax(ret, total);
    }
    return ret;
}
相关推荐
ALex_zry1 天前
C++26 std::complex 结构化绑定详解:auto [re, im] = c
c语言·开发语言·c++
Zw-awa1 天前
01-写了include之后到底发生了什么
c语言
旖-旎1 天前
《LeetCode 746 使用最小花费爬楼梯 || LeetCode 91 解码方法》
c++·算法·leetcode·动态规划
wabs6661 天前
关于动态规划【力扣1035.不相交的线和53.最大子数组和的思考】
算法·leetcode·动态规划
退休倒计时1 天前
【每日一题】LeetCode 199. 二叉树的右视图 TypeScript
算法·leetcode·typescript
小O的算法实验室1 天前
2026年ESWA,基于全局进化动态规划与局部粒子群优化GPU 支持去中心化多机器人路径规划
动态规划
CodeStats1 天前
【编程语言】深度梳理C/C++、Java、Python、Go、Rust的区别
java·linux·c语言·c++·python·rust·go
硕风和炜1 天前
【LeetCode: 1301. 最大得分的路径数目 + DP】
java·算法·leetcode·动态规划·dp·记忆化搜索
文祐1 天前
C语言用双向链表实现单调递减(递增)队列
c语言·开发语言·链表
Keven_111 天前
AcWing算法提高课思路速查:动态规划
算法·动态规划