剑指Offer----面试题31:连续子数组的最大和

来源:互联网 发布:javascript经典例子 编辑:程序博客网 时间:2024/06/05 19:25

题目:


输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数数组组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n).


分析:


例如输入数组 1, -2, 3, 10, -4, 7, 2, -5 },和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和为18.



源代码:


#include<iostream>#include<vector>using namespace std;bool invalidInput = false;int MaxSum2(int *arr, int length, vector<int> &vec){if (arr == nullptr || length <= 0){invalidInput = true;return 0;}invalidInput = false;int currentSum = 0;int GreatestSum = 0x80000000;vector<int> vecTemp;for (int i = 0; i < length; ++i){if (currentSum <= 0)//相当于初始化{vecTemp.clear();currentSum = arr[i];vecTemp.push_back(arr[i]);}else{currentSum += arr[i];vecTemp.push_back(arr[i]);}if (currentSum > GreatestSum){vec.assign(vecTemp.begin(), vecTemp.end());GreatestSum = currentSum;}}return GreatestSum;}void test11(){cout << "==================test1===================" << endl;int arr[] = { -1, -2, -3, -4, -5, -6, -7, -8 };vector<int> vec;int sum = MaxSum2(arr, 8, vec);if (!invalidInput){cout << "Max sum = " << sum << endl;cout << "元素分别为:" << endl;for (const auto &t : vec)cout << t << "  ";cout << endl;}elsecout << "Invalid input" << endl;}void test12(){cout << "==================test2===================" << endl;int arr[] = { -8, -7, -6, -5, -4, -3, -2, -1 };vector<int> vec;int sum = MaxSum2(arr, 8, vec);if (!invalidInput){cout << "Max sum = " << sum << endl;cout << "元素分别为:" << endl;for (const auto &t : vec)cout << t << "  ";cout << endl;}elsecout << "Invalid input" << endl;}void test13(){cout << "==================test3===================" << endl;int arr[] = { 1, -2, 3, 10, -4, 7, 2, -5 };vector<int> vec;int sum = MaxSum2(arr, 8, vec);if (!invalidInput){cout << "Max sum = " << sum << endl;cout << "元素分别为:" << endl;for (const auto &t : vec)cout << t << "  ";cout << endl;}elsecout << "Invalid input" << endl;}void test14(){cout << "==================test4===================" << endl;int *arr = nullptr;vector<int> vec;int sum = MaxSum2(arr, 8, vec);if (!invalidInput){cout << "Max sum = " << sum << endl;cout << "元素分别为:" << endl;for (const auto &t : vec)cout << t << "  ";cout << endl;}elsecout << "Invalid input" << endl;}int main(){test11();cout << endl;test12();cout << endl;test13();cout << endl;test14();cout << endl;system("pause");return 0;}

运行结果:
==================test1===================Max sum = -1元素分别为:-1==================test2===================Max sum = -1元素分别为:-1==================test3===================Max sum = 18元素分别为:3  10  -4  7  2==================test4===================Invalid input请按任意键继续. . .



0 0
原创粉丝点击