给你一个整数数组 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
提示:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
int maxSubArray(int* nums, int numsSize)
{
int dp[numsSize + 2];
dp[0] = 0;
int i;
int max = nums[0];;
for(i = 1; i <= numsSize ; i++ )
{
dp[i] = fmax(nums[i-1], dp[i-1] + nums[i-1]);得到一个最优解
max = fmax(max, dp[i] );得到一个最大值
}
return max ;
}
这个题有两种做法,一个为动态规划,一个为贪心算法,这里是动态规划的代码,下面是解题思路。
1到-1到3有两种路径1到-1到3和-1到3,然后1到-1到3到4也有两种路径,通过1到-1到3的最优解为一种路径也就是1到-1到3到4和3到4,然后得到最优解,最后得到一个最大值。就是通过将一个大问题分割成一个个小问题,最后得到大问题的解。
1 | -1 | 3 | 4 |
还有一种解题方式为贪心算法。
int maxSubArray(int* nums, int numsSize)
{
int sum = 0;
int max = INT_MIN;
for(int i = 0;i<numsSize;i++)
{
sum += nums[i];
if(sum>max)取最大值
{
max = sum;
}
if(sum < 0)如果小于0舍去
{
sum = 0;
}
}
return max;
}
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
2.贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素。
3.当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。贪心算法的每一次操作都对结果产生直接影响。贪心算法对每个子问题的解决方案都做出选择,不能回退。
4.贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。
5.实际上,贪心算法适用的情贪心算法(贪婪算法)况很少。一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可以做出判断。
-2 | 1 | -3 | 4 | -1 | 2 |
sum小于0舍去,sum等于1,max为1,sum加上-3为负数舍去,sum等于4,加上-1为三,大于0,不舍去,然后再加2,就得到了局部最优解。这就是贪心算法的方法希望可以帮你们更好的理解。