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

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



参与人数:2845  时间限制:1秒   空间限制:32768K
本题知识点: 数组

题目描述

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


分析:
方法1:条件累加(时间复杂度O(n))

用currentSum记录当前数的和,用maxSum来保存功能函数FindGreatestSumOfSubArray整个过程中的最大和,将maxSum初始化为最小的负整数。如果当前和currentSum<0,则将currentSum置为0,以紧跟的那个数为第一个开始累加,如果currentSum>maxSum,将maxSum置为currentSum,当然若currentSum=0,此时不操作 等价于置为0.

另外,此题中要求输入为[](即输入向量array的长度为0)时,需要返回0,这点需要注意一下.


方法2:动态规划


方法1

AC代码:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include<iostream>  
  2. #include<vector>  
  3. using namespace std;  
  4. class Solution {  
  5. public:  
  6.     int FindGreatestSumOfSubArray(vector<int> array) {  
  7.     if(array.size()==0) return 0;  // 输入向量的元素为空,输入无效  
  8.     int maxSum = -1<<31; // int maxSum = INT_MIN;   用来保存最大和,初始化为最小的负整数,剑指offer原书上用的16进制带符号的0x80000000表示最小的负整数,不易理解,C++中有相应的常量INT_MIN  
  9.     int currentSum = 0;  
  10.     for(int i=0;i<array.size();i++)  
  11.     {  
  12.         currentSum += array[i];  
  13.         if(currentSum > maxSum)  
  14.             maxSum = currentSum; // 将最大和更新为当前和  
  15.         if(currentSum < 0)  
  16.             currentSum = 0;  
  17.     }  
  18.     return maxSum;  
  19.     }  
  20. };  
  21. // 以下为测试部分   
  22. /*  
  23. int main() 
  24. { 
  25.     vector<int> vec={2,-3,5,-6,10,20};  // vector<int> vec={}; 向量直接赋值的方法C++11标准支持,编译器如果比较旧需要先写数组或迭代器,然后以相关元素创建数组  
  26.     Solution sol; 
  27.     cout<<sol.FindGreatestSumOfSubArray(vec)<<endl; 
  28.     return 0; 
  29. } 
  30. */  

注: INT_MIN和INT_MAX在C语言limits.h中定义,而float.h 定义了double、float类型数的最大最小值,本地测试需要#include<limits.h>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值