面试题31连续数组的最大和

本文详细介绍了解决连续数组最大和问题的两种算法:暴力枚举和动态规划,并通过C++代码实现展示了如何高效地解决此类问题。包括问题背景、解题思路、代码实现及时间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试题31连续数组的最大和

思路:最笨最直接的做法枚举数组的所有子数组并求出它们的和。长度为n的数组一共有n*(n-1)/2个子数组时间复杂度为O(n^2)

// 遍历数组同时设立两个变量cursum maxsum cursum<=0 时跟新cursum 为当前元素值。每次更新最大值maxsum的值即可

//用中规中矩的动态规划法用函数f(i)表示以第i个数字结尾的子数组的最大和。目标函数为max(f(i)) 其中0<=i<n;

//f(i)=a[i]  if(i==0||f(i-1)<=0)

//f(i)=f[i-1]+a[i] if(i!=0&&f(i-1)>0)

函数接口:GetGreastSumOfSubArray(int*a,int length);


#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
//面试题31连续数组的最大和 思路:最笨最直接的做法 枚举数组的所有子数组并求出它们的和。长度为n的数组一共有n*(n-1)/2个子数组时间复杂度为O(n^2)
// 遍历数组同时设立两个变量cursum 和maxsum 当cursum<=0 时跟新cursum 为当前元素值。每次更新最大值maxsum的值即可
//用中规中矩的动态规划法 用函数f(i)表示以第i个数字结尾的子数组的最大和。目标函数为max(f(i)) 其中0<=i<n;
//f(i)=a[i]  if(i==0||f(i-1)<=0)
//f(i)=f[i-1]+a[i] if(i!=0&&f(i-1)>0)
bool gInvalidInput=false;
//方法一最直观的做法
int GetGreastestSumOfSubArray(int a[],int length)
{   
   if(a==NULL||length<=0)
   {
       gInvalidInput=true;
	   return 0;
   }
   int maxsum=0x80000000;//32位整形能表示的最小负整数
   for(int i=0;i<length;i++)
   {
      int cursum=0;
	  for(int j=i;j<length;j++)
	  {
		  cursum+=a[j];
	      if(cursum>maxsum)
		  {
		      maxsum=cursum;
		  }
		  
	  }
   }
   return maxsum;
}
int GetGreastestSumOfSubArray2(int a[],int length)
{

	  if(a==NULL||length<=0)
	   {
		   gInvalidInput=true;
		   return 0;
	   }
      int cursum=0;
	  int maxsum=0x80000000;
	  for(int i=0;i<length;i++)
	  {
	     if(cursum<=0)
		 {
		    cursum=a[i];
		 }
		 else
		 {
		     cursum+=a[i];
		 }
		 if(cursum>maxsum)
		 {
		     maxsum=cursum;
		 }
	  }
	  return maxsum;
}
//用动态规划来做。用函数f(i)表示以第i个数字结尾的子数组的最大和。目标函数为max(f(i)) 其中0<=i<n;
//f(i)=a[i]  if(i==0||f(i-1)<=0)
//f(i)=f[i-1]+a[i] if(i!=0&&f(i-1)>0)
int GetGreastestSumOfSubArray3(int a[],int length,int f[],int *lastIndex)//lastIndex 为最大和的最后一个累加数的数组索引
{
      if(a==NULL||length<=0)
	   {
		   gInvalidInput=true;
		   return 0;
	   }
	  f[0]=a[0];
	  for(int i=1;i<length;i++)
	  {
	      if(f[i-1]>0)
		  {
		      f[i]=a[i]+f[i-1];
		  }
		  else
		  {
		      f[i]=a[i];
		  }
	  }
	  int max=0x80000000,maxIndex=-1;
	   for(int i=1;i<length;i++)
	  {
	     if(max<f[i])
		 {
		    max=f[i];
            maxIndex=i;
		 }
	  }
	  *lastIndex=maxIndex;
	  return max;
}
int main()
{
	int a[8]={1,-2,3,10,-4,7,2,-5};
	int f[8]={0},lastIndex;
	cout<<GetGreastestSumOfSubArray(a,8)<<endl;
	cout<<GetGreastestSumOfSubArray2(a,8)<<endl;
	cout<<GetGreastestSumOfSubArray3(a,8,f,&lastIndex)<<endl;
	cout<<a[lastIndex]<<endl;
	//<<i<<endl;
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值