最大子数组

5 篇文章 0 订阅
1 篇文章 0 订阅

最大子数组

问题描述:

对给定数组A,寻找A的和最大的非空连续子数组。

输入格式:

输入的第一行包括一个整数n,代表数组中的元素个数,接下来的一行包含n个整数(可以包含负数),以空格分隔。

输出格式:

一个整数,表示最大的连续子数组的和。

样例输入:

9
2 4 -7 5 2 -1 2 -4 3

样例输出:

8

分析

利用分治的思想,划分为小段数组l-mid的最大值与mid+1-r和l-r作比较,比较之后返回上层循环一直到整个数组。

代码
#include<iostream>

using namespace std;

//找到l-r有关mid中的最大值
int FindMidMax(int a[], int l, int r, int mid){
	
	int LmidMax = -1000;
	int RmidMax = -1000;
	int sum = 0;
	
	//左数组中的从mid开始的最大值
	for(int i=mid; i>=l; i--){
		sum += a[i];
		if(sum>LmidMax){
			LmidMax = sum;
		}
	}
	
	//右数组中的从mid开始的最大值
	sum = 0;
	for(int i=mid+1; i<r; i++){
		sum += a[i];
		if(sum>RmidMax){
			RmidMax = sum; 
		}
	}
	
	return RmidMax+LmidMax;
	
}

int FindMaxSum(int a[], int l, int r){
	
	if(l==r) return a[l];
	
	int mid = (l+r)/2;
	
	int LeftMax = FindMaxSum(a, l, mid);
	int RightMax = FindMaxSum(a, mid+1, r);
	int MidMax = FindMidMax(a, l, r, mid);
	
	if(LeftMax>=RightMax && LeftMax>=MidMax)
		return LeftMax;
	else if(RightMax>=LeftMax && RightMax>=MidMax)
		return RightMax;
	else 
		return MidMax;
	
	
}

int main(){
	
	int N;
	int a[100];
	
	cin>>N;
	for(int i=1; i<=N; i++)
		cin>>a[i];
	
	int sum = FindMaxSum(a, 1, N);
	cout<<sum;
	
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值