30、剑指offer--连续子数组最大和

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)

解题思路:本题时动态规划问题

dp[i]表示到以a[i]结尾的最长连续子数组的最大和

dp[i] = array[i]  i==0 || dp[i-1]<0

dp[i] = dp[i-1] + array[i] i != 0 && dp[i-1] > 0

定义一个初始值为最小值的maxSum,然后如果dp[i]>maxSum   maxSum = dp[i]最后返回maxSum

 1 class Solution {
 2 public:
 3     //dp[i] = array[i]  i==0 || dp[i-1]<0
 4     //dp[i] = dp[i-1] + array[i] i != 0 && dp[i-1] > 0
 5     int FindGreatestSumOfSubArray(vector<int> array) {
 6         int length = array.size();
 7         if(array.empty() || length <=0)
 8             return 0;
 9         int dp[length];
10         memset(dp,0,length);
11         dp[0] = array[0];
12         int maxSum = 0x80000000;
13         for(int i=1;i<length;i++)
14         {
15             if(dp[i-1] > 0)
16             {
17                 dp[i] = dp[i-1] + array[i];
18             }
19             else
20             {
21                 dp[i] = array[i];
22             }
23             if(dp[i] > maxSum)
24             {
25                 maxSum = dp[i];
26             }
27         }
28         return maxSum;
29     }
30 };
时间: 2024-12-17 07:54:03

30、剑指offer--连续子数组最大和的相关文章

剑指offer 连续子数组的最大和

在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 一. 动态规划 设sum[i]为以第i个元素结尾且和最大的连续子数组.假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组实际上,要么是以第i-1个元素结

剑指 Offer——连续子数组的最大和

1. 题目 2. 解答 初始化 sum=0,然后遍历数组进行累加.如果 sum 变为负数,也就说再继续累加的话贡献为负,我们需要更新 sum=0,重新开始累加. 初始化 max_sum 为数组的第一个元素,之所以不初始化为零,就是防止出现数组中全为负数的情况,比如 [-2, -1, -3, -4, -5].在遍历数组的过程中,如果 sum > max_sum,就更新 max_sum=sum,最后 max_sum 即为所求. class Solution { public: int FindGre

剑指Offer29 连续子数组最大和

1 /************************************************************************* 2 > File Name: 29_GreatestSumOfSubArray.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月01日 星期四 20时37分22秒 6 *****************************

剑指OFFER 连续数组的最大和

剑指OFFER 连续数组的最大和 经典的动态规划题 其思路是把所有的和都算出来,当然不能简单粗暴的直接相加,要利用上一次计算出的结果加速第二次的运算 class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { int size = array.size(); int max = INT_MIN; //dp 数组初始化,dp[i][j]表示从i到j的和,例如dp[0][1]表示array[0]+array

剑指Offer3_连续子数组的最大和

一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) 二.解题思路 开始看到这道题是有点懵的,甚至

剑指offer--43.连续子数组的最大和

最大子段和,最大能取所有 ---------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度指数:211448 本题知识点: 数组 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢

3-剑指Offer: 连续子数组的最大和

题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) 代码: // 考虑动态规划. // 对于某个元素

Maximum Subarray 连续子数组最大和

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figur

连续子数组最大和(转)

求一个数组的相加和最大的连续子数组 思路: 一直累加,只要大于0,就说明当前的“和”可以继续增大, 如果小于0了,说明“之前的最大和”已经不可能继续增大了,就从新开始, result=max{result+arr[i],arr[i]};显然,若result>0,则可以继续相加,否则,就重新开始. #include<stdio.h> #define INF 65535 int Maxsum(int * arr, int size) { int maxSum = -INF; int sum