天天看点

(LeetCode)最大子数组和——动态规划题目要求题目理解以及思路分析代码讲解总结

目录

题目要求

题目理解以及思路分析

代码讲解

总结

题目要求

给你一个整数数组 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 <= 105

-104 <= nums[i] <= 104

来源:力扣(LeetCode)

看完这道题目第一眼是不是觉得这道题目很简单?,但是在多看你一眼就觉得有点难度,当我们下手准备去干他的时候不知不觉就发现我们做了半天的时间了。是不是很真实?下面本篇将对这道题进行讲解。

题目理解以及思路分析

(一) 看见一道题就要先搞懂题目。这个题目的要求就是在给定的数组中任意截取一段使得这一段的和是所有可能的结果中最大的。怎么样,看到这是不是突然觉得这题一点都不简单?很多人开始嘀咕:这得多少种可能啊,而且我怎么保证和就是最大的?

(二) 当你有上面的疑问时,说明你的第一思路就是暴力解法,这种暴力解法用好了是故事,用不好就是事故。所以本篇文章将用一个新的算法来解决——动态规划。

(三) 之前我们讲过 “回溯法”,“栈”,“双指针”,“哈希表”等算法,今天我们便要介绍一个新的算法也是十分十分常见的算法——动态规划

(四) 什么是动态规划呢?

动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果

                                                                                                                          ( 百度百科 )

看完了?能看懂吗?反正我是有点迷糊。我们只要知道动态规划的用法以及在什么时候用到就已经可以了。

(五) 明白这些,下面就是该如何实现题目的要求。仔细看看题目的例题我们可以设想一下,用两个变量进行比较分别是 top+nums[ i ] 和 nums[ i ] ,从二者中取最大值赋给 top (即更新 top 的值)再将更新后的 top 值与 maxfun 进行比较取最大值 (这里注意:maxfun 的初始值应为 nums[ 0 ] )

这些是我们的设想,相信很多读者看到这依然会有疑问,为了更好的便于理解我画了下面的图解进行讲解

(LeetCode)最大子数组和——动态规划题目要求题目理解以及思路分析代码讲解总结

 这样是不是更好理解呢?其实在 top = max ( top + nums[ i ], nums[ i ] ) 这一步就已已经找到了符合要求的子数组,但是这道题并没有要求输出 子数组 ,所以我们只需要最后的 maxfun 

明白了这些我们接下来便开始进行代码的讲解

代码讲解

int maxSubArray(int* nums, int numsSize){
    int top = 0,i;
    int maxfun = nums[0];
    for(i = 0;i < numsSize;i ++)
    {
      top = fmax(top + nums[i], nums[i]);
      maxfun = fmax(maxfun, top);
    }
    return maxfun;
}
           

特别说明一点哦,这个是全部的完整代码。怎么样?是不是很简单,之前写了这么多代码,看见这一个是不是很开心

有两个地方要特别注意一下:

(一) 

max = fmax(n, m);
           
fmax 函数的作用就相当于 C++中的 max ;比较两个数字取最大值

(二) 

for(i = 0;i < numsSize;i ++)
           

特别注意 i < numSize 

因为 numSize 是数组的长度 ,但是数组是从 0 开始计数的,所以这个细节不要忘记

总结

本题介绍了——动态规划的思想,这种方法常用于解决 背包问题,最短路径问题等等,熟练运用这种方法可以使得做题事半功倍。