剑指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
- 《剑指Offer》面试题:连续子数组的最大和
- [剑指offer][面试题31]连续子数组的最大和
- 剑指offer面试题31:连续子数组的最大和
- 剑指Offer:面试题31 连续子数组的最大和
- 剑指offer 面试题31 求连续子数组的最大和
- 《剑指Offer》学习笔记--面试题31:连续子数组的最大和
- 【剑指Offer学习】【面试题31:连续子数组的最大和】
- 剑指Offer面试题31(java版):连续子数组的最大和
- 【剑指offer】5.2时间效率——面试题31:连续子数组的最大和
- 剑指offer代码解析——面试题31连续子数组的最大和
- 剑指offer-面试题31:连续子数组的最大和
- 剑指offer 面试题31:连续子数组的最大和 题解
- 剑指offer之面试题31连续子数组的最大和
- 剑指Offer:面试题31——连续子数组的最大和(java实现)
- 剑指Offer----面试题31:连续子数组的最大和
- 剑指offer面试题31:连续子数组的最大和
- 剑指offer--面试题31:连续子数组的最大和
- 连续子数组的最大和(剑指Offer 面试题31)
- 动态树 Link Cut Tree
- 华为OJ 初级:判断两个IP是否属于同一子网
- HDU 2028 Lowest Common Multiple Plus
- Linux nice命令详解
- 一次完整的HTTP事务是怎样一个过程?
- 剑指Offer----面试题31:连续子数组的最大和
- 我的第一篇博客
- hdu5772String problem
- EL表达式用法
- C#控制台 创建一维int型数组
- 静态员初始化
- DP-爬楼梯
- 一期项目总结
- poj1236——Network of Schools(强连通分量+缩点)