最大连续子数组

问题:

给定一个数组A[0,…,n-1],求A的连续子数组,使得该数组的和最大。

exp:

数组:1,-2,3,10,-4,7,2,-5
最大子数组:3,10,-4,7,2

1 暴力法

时间复杂度为O(n3

1.1 代码

int MaxSubArray(int *A, int n)     //最大连续子数组,参数为数组首地址和数组长度
{
   
	int maxSum = A[0];
	int currSum;
	for (int i = 0; i < n; i++)                //0≤i≤n-1
	{
   
		for (int j = i; j < n; j++)				//i≤j≤n-1
		{
   
			currSum = 0;
			for (int k = i; k <= j; k++)        //i≤k≤j
			{
   
				currSum += A[k];
			}
			if (currSum > maxSum)
				maxSum = currSum;
		}
	}
	return maxSum;
}

1.2 测试代码

int main()
{
   
	int a[] = {
     1,-2,3,10,-4,7,2,-5  };
	int len = sizeof(a) / sizeof(a[0]);
	cout<<MaxSubArray( a, len )<<endl;
	
	//替代system("pause");
	cin.clear();   //
	cin.sync();   //清空缓存区
	cin.get();    //真正接收到键盘输入

	return 0;
}

1.3 代码改进

1.3.1 system(“pause”)

对于输出结果一闪而过的问题未作仔细研究,后续会仔细研究如何解决。一般选择使用system("pause");语句来解决问题。但此方法据大佬说不建议使用,故而选择1.2中语句代替。参考system pause.

1.3.2 输出最大和子数组 vs 最大和

题目要求输出A的最大连续子数组,代码只求出了和。定义两个变量分别对应子数组的第一个和最后一个下标,输出子数组。方法相同,后续不再赘述。代码如下:

#include<iostream>
using namespace std;

int MaxSubArray(int *A, int n)     //最大连续子数组,参数为数组首地址和数组长度
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值