求整数数组、环形数组中最大子数组的和
一、整数数组
1、题目要求:
a、输入一个整数数组,数组里有正数也有负数。
b、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
c、求所有子数组的和的最大值。
2、思路构想:
求数组中的一个元素(a)和上一个元素(b)的和(c),将 a 和 c 进行比较,若 c > a ,则用 c 代替 a 的值,此操作遍历整个数组,此时最大子数组的和就会被保存在数组中的某一个位置。最后再次遍历数组,求得最大子数组的和。
3、核心算法:
for(i=2;i<=n;i++) { if(a[i]+a[i-1]>a[i]) a[i]=a[i]+a[i-1]; } int ans=-100000; for(i=1;i<=n;i++) ans=max(ans,a[i]);
4、程序源代码:
#include<iostream> using namespace std; int main() { int a[100],i,n; cout<<"数组的长度:"; cin>>n; cout<<"依次输入数组中的元素:"; for(i=1;i<=n;i++) { cin>>a[i]; } for(i=2;i<=n;i++) { if(a[i]+a[i-1]>a[i]) a[i]=a[i]+a[i-1]; } int ans=-100000; for(i=1;i<=n;i++) ans=max(ans,a[i]); cout<<"最大子数组的和:"<<ans<<endl; return 0; }
5.运行结果
二、环形数组
1、题目要求:
将题目一的整数数组的首尾相连变成一个环形数组后,求最大子数组的和。
2、思路构想:
环状数组出现最大连续子数组和有两种情况:a、a[0]~a[n]之间 b、包含a[n]~a[0]。 情况 a 按照整数数组求最大子数组球和即可,对于情况 b,既然最大的会包含a[n]~a[0],那么最小连续区间应该是在a[0]~a[n]范围内的,因此只要我们找出最小连续区间的末位置,以此开始作为起点来进行普通数组的处理就可以找到第二种解法的答案。最后比较这两种情况的结果,求得环状数组最大连续子数组的和。
3、程序源代码:
#include<iostream> using namespace std; int main() { int a[100],b[100],i,n; cout<<"数组的长度:"; cin>>n; cout<<"依次输入数组中的元素:"; for(i=1;i<=n;i++) { cin>>a[i]; } for(i=1;i<=n;i++) { b[i]=a[i]-2*a[i]; } int k=0; for(i=1;i<=n;i++) { k+=a[i]; } //情况a for(i=2;i<=n;i++) { if(a[i]+a[i-1]>a[i]) a[i]=a[i]+a[i-1]; } int ans=-100000; for(i=1;i<=n;i++) ans=max(ans,a[i]); //情况b for(i=2;i<=n;i++) { if(b[i]+b[i-1]>b[i]) b[i]=b[i]+b[i-1]; } int ans1=-100000; for(i=1;i<=n;i++) ans1=max(ans1,b[i]); int ans2=k +ans1; int ans3=max(ans,ans2); cout<<"最大子数组的和:"<<ans3<<endl; return 0; }
4.运行结果