数组问题
Posted 2506236179zhw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组问题相关的知识,希望对你有一定的参考价值。
(一)一维最大连续子数组和
源码:
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100000;
int main() {
int i,j,k;
int a[N];
int sum[N];
int n;
printf("请输入数组个数: ");
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
sum[1]=a[1];
int maxn=sum[1];
for(i=2;i<=n;i++) {
if(sum[i-1]>0)
sum[i]=a[i]+sum[i-1];
else sum[i]=a[i];
maxn=max(maxn,sum[i]);
}
cout<<maxn<<endl;
return 0;
}
(二)环状数组求最大连续子数组和
#include<iostream>
#include<cstring>using namespace std;int n;int NotCircle(int a[])
{
int maxn=-1000;
int sum[10000];
sum[0]=a[0];
for(int i=1;i<n;i++)
{
if(a[i]<a[i]+sum[i-1])
{
sum[i]=a[i]+sum[i-1];
}
else
{
sum[i]=a[i];
}
if(maxn<sum[i])
maxn=sum[i];
}
return maxn;
}
int findmin(int a[])
{
int minx=10000000;
int sum[10000];
int flag=0;
sum[0]=a[0];
for(int i=1;i<n;i++)
{
if(sum[i-1]<0)
sum[i]=sum[i-1]+a[i];
else
sum[i]=a[i];
if(minx>sum[i])
{
minx=sum[i];
flag=i;
}
}
return flag;
}
int Circle(int a[])
{
int minid=findmin(a);
int key=(minid+1)%n;
int j;
int maxn=a[key];
int sum=0;
for(j=key;(j%n)!=minid;j++)
{
if(sum>0)
sum+=a[j%n];
else
sum=a[j%n];
if(maxn<sum)
maxn=sum;
}
return maxn;
}
int main()
{
int a[100],i,j;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
int ans1=NotCircle(a);
int ans2=Circle(a);
cout<<ans1<<" "<<ans2<<endl;
int ans=max(ans1,ans2);
cout<<ans;
return 0;
}
以上是关于数组问题的主要内容,如果未能解决你的问题,请参考以下文章