返回一个整数数组中最大子数组的和2
Posted messi2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回一个整数数组中最大子数组的和2相关的知识,希望对你有一定的参考价值。
要求:
输入一个一维整形数组,数组里有正数也有负数。
一维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。时间复杂度O(n)
思路分析:
先说点题外话,课上那两种方法我感觉没一个对的。
这个题其实和上回那个题基本一样,只不过这回把这个一维数组连成环了。不过仍然是求最大子数组的和,首尾相接的。说实话循环两次说起来容易做起来不好控制。不妨换个思路,想想看,上次求了个不是首尾相接的最大值,这回干脆按照上回的思路求个最小值,再用整个数组的和减去这个最小值就搞定了。具体求非首尾相接子数组最小和的思路不再细讲,直接上代码。
1 int main(){ 2 system("title 08返回一个整数数组中最大子数组的和"); 3 cout << "数字要求:必须有正数和负数同时存在,可以有0" << endl; 4 int len = 0; 5 cout << "输入数组长度:"; 6 cin >> len; 7 int*a = new int[len]; 8 cout << "输入" << len << "个数字:"; 9 for (int i = 0; i < len; ++i) 10 cin >> a[i]; 11 int sum = 0; 12 int sum1 = 0; 13 int min = a[0]; 14 for (int i = 0; i < len; ++i){ 15 sum1 += a[i]; 16 if (sum + a[i] >= 0)sum = 0; 17 else sum += a[i]; 18 min = min<sum ? min : sum; 19 } 20 cout << "最大子数组的和:"<<sum1 - min << endl; 21 return 0; 22 }
验证截图:
总结:
还是关于贪心算法的问题,不过这次拐了个弯儿。
以上是关于返回一个整数数组中最大子数组的和2的主要内容,如果未能解决你的问题,请参考以下文章