计算一个数组内n个连续子串的和的最大值
2018-09-19 21:07
549 查看
计算一个数组内n个连续子串的和的最大值
问题描述
众所周知,strawberry的妹子很多而且总数甚至是不可数的,妹子集合和阿里夫零等势。今天strawberry把他的n个妹子带来,排成一排。strawberry的妹子很多,但是质量不容乐观。每个妹子有美丽度,有正有负。strawberry想选出其中3队妹子,使得她们的美丽度之和最大。每一队都应该是一个连续的区间。而且两队不能选择同一个妹子。strawberry又去找新的妹子了。请你帮帮strawberry算算最大美丽度是多少?
Input
输入一行一个数n,表示strawberry这次带来的妹子数。接下来一行n个数,分别表示每个妹子的美丽度。
Output
输出一个数,表示最大美丽度。
示例
10
-1 2 3 -4 0 1 -6 -1 1 -2
7
解答1
答案比较简单,用空间换时间,效率还行。
#include <iostream> #include <vector> #include <algorithm> #include <numeric> using namespace std; //定义分组数目 #define GROUP_COUNT 3 int main() { int nCount; vector<int> vec; cin >> nCount; for (int i = 0; i < nCount; i++) { int a; cin >> a; vec.push_back(a); } vector<int> resultVec; vector<int> nagativeVec; int nSum = 0; for (int i = 0; i < nCount; i++) { if (vec[i] <= 0) { if (nSum != 0) { resultVec.push_back(nSum); nSum = 0; } nagativeVec.push_back(vec[i]); } else { if (i + 1 == nCount) { if (nSum > 0) { resultVec.push_back(nSum); } } else { nSum += vec[i]; } } } sort(resultVec.begin(), resultVec.end()); sort(nagativeVec.begin(), nagativeVec.end()); int nResult = 0; int nDel = GROUP_COUNT - resultVec.size(); if (nDel <= 0) { //足够3个 int nSize = resultVec.size(); for(int n = 1; n <= GROUP_COUNT; n++) { nResult += resultVec[nSize - n]; } } else { //先求和 nResult = accumulate(resultVec.begin(), resultVec.end(), 0); for (int j = nagativeVec.size() - 1; j >= 0 && nDel >= 0; j++, nDel--) { nResult += nagativeVec[j]; } } cout << nResult; getchar(); getchar(); return 0; }
解答2
#include <iostream> #include <vector> using namespace std; #define GROUP_COUNT 3 int maxSubArray(vector<int> A) { int sum = 0; int maxsum = INT_MIN; for (int i = 0; i < A.size(); i++) { sum += A[i]; if (sum > maxsum) maxsum = sum; if (sum < 0) sum = 0; } return maxsum; } int main55555555() { int nCount; vector<int> vec; cin >> nCount; for (int i = 0; i < nCount; i++) { int nValue; cin >> nValue; vec.push_back(nValue); } //分为三等分 int a = nCount / GROUP_COUNT; int b = nCount - a * 2; vector<int> vec1, vec2, vec3; //首部 int i = 0; for (; i < a; i++) { vec1.push_back(vec[i]); } for (; i < a + b; i++) { vec2.push_back(vec[i]); } for (; i < a + b + a; i++) { vec3.push_back(vec[i]); } int nSum = maxSubArray(vec1) + maxSubArray(vec2) + maxSubArray(vec3); return 0; }
备注
这两个解答都是最优解法,如果有想出来的朋友请留言。此问题是Google面试题的改进版。
阅读更多相关文章推荐
- 求一个整形数组的和最大的连续子串 -------- 程序员面试金典
- 一个正负数组,求其最大的连续子串和
- JAVA :在给定一个数组中,可以取得多个连续的子串。在众多子串中,求各元素和为最大值的连续子串!
- 如何计算一个整形数组里的连续元素和的最大值?
- 计算一个整形数组里的连续元素和的最大值
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 求一个数组中连续子数组的最大乘积
- 求一个字符串中的最大连续重复子串
- 计算一个字符串中最大的子串的长度,并将它返回。如“abc12345sdfsasdfsd”最大的子串是sdfsasdfsd
- 一个程序搞定最小编辑距离,最大公共子串,最大连续公共子串
- 求一个数字数组里的最大连续数字的个数
- 一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值,要求时间复杂度为O(n)。
- 寻找数组中的最大连续子串
- 给一个字符串s,计算具有相同数字0和1的非空(连续)子字符串的数量,并且这些子字符串中的全部0和全部1被连续分组。子串发生多次被计数的次数。
- 编写一个计算一维数组中所有整数的最大公约数的函数
- 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), 使得这个“子数组”的和是所有“子数组”和中最大的
- 求一个乱序数组的元素最大连续长度
- 编程之美--求数组连续子串最大和
- 求解一个数组中连续元素最大值
- 在一个数组中找出和最大的一个连续的子数组串