连续子数组的最大和
2017-08-22 17:21
232 查看
/*
面试题31:连续子数组的最大和
:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n).
*/
/*
解题思路:1.例如一个数组{5,2,-10,7,2,-1},先初始化和为0,从第一个数字开始累加,此时的和就是第一个数字5,
2.此时再继续加,当加到第二个数字和为7,判断这个数字是否大于之前的和,如果大于,将最大值更新为7
3.继续加第三个数字,和为-3,此时需要判断和是否大于0,如果小于等于0,我们需要舍弃之前的和,现在-3<0,我们从7开始重新累加,此时最大值依旧为7.
4.7和2相加后和为9,于是将最大值更新为9,再继续加之后变为8,由于8小于9,于是我们返回值为9
*/
面试题31:连续子数组的最大和
:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。要求时间复杂度为O(n).
*/
/*
解题思路:1.例如一个数组{5,2,-10,7,2,-1},先初始化和为0,从第一个数字开始累加,此时的和就是第一个数字5,
2.此时再继续加,当加到第二个数字和为7,判断这个数字是否大于之前的和,如果大于,将最大值更新为7
3.继续加第三个数字,和为-3,此时需要判断和是否大于0,如果小于等于0,我们需要舍弃之前的和,现在-3<0,我们从7开始重新累加,此时最大值依旧为7.
4.7和2相加后和为9,于是将最大值更新为9,再继续加之后变为8,由于8小于9,于是我们返回值为9
*/
#include<iostream> using namespace std; #if 1 int FindGreatestSumOfArray(int *pData,int nLength) { bool IsInvalidArr = false; //判断数组是否有效 if(pData == NULL ||nLength == 0) { IsInvalidArr == true; } int nCurnum = 0; int nGreatestSum = 0x80000000; for(int i = 0;i<nLength;i++) { //如果当前累加和小于0,则舍弃当前的和,从下一个数字开始。 if(nCurnum <=0) nCurnum = pData[i]; //否则的话一直累加 else nCurnum+=pData[i]; //此处需要每次更新累加和,保证最后得到的是最大的累加和 if(nCurnum >nGreatestSum) nGreatestSum = nCurnum; } return nGreatestSum; } int main() { //int arr[] = {1,-2,3,10,-4,7,2,-5}; int arr[] = {5,2,-10,7,2,-1}; int length = sizeof(arr)/sizeof(int); int sum; sum = FindGreatestSumOfArray(arr,length); cout<<sum<<endl; } #endif
相关文章推荐
- [动态规划]最大连续子数组和的四种算法
- 最大连续子数组和
- 数组的连续子数组最大和(首尾相连)
- 连续子数组的最大和
- 求连续子数组的最大和
- 求解最大连续子数组问题
- 连续子数组最大和问题(能够处理全是负数,返回子数组的起止索引的O(N)算法)
- 连续子数组的最大和
- 三种方法求连续子数组的最大和
- 最大连续子数组和(算法导论算法实现)
- 剑指offer 机器人的运动范围 矩阵中的路径 滑动窗口最大值 次数超过一半的数 连续子数组的最大和
- 给定一个由非负整数和整数m组成的数组,可以将该数组分成m个非空的连续子数组。 写一个算法来最小化这些m个子阵列之间的最大和。
- 算法学习-连续子数组求和最大值
- 求数组中最大连续子数组的和
- 连续子数组的最大乘积
- 求连续子数组的最大和---2017滴滴笔试编程1
- LeetCode-53:Maximum Subarray (和最大的连续子数组)
- 连续子数组最大和或最大子段和的求解算法及其正确性
- 剑指offer--31连续子数组最大和
- 连续子数组的最大乘积、最小乘积