题目:返回一个一维循环数组中最大子数组的和
方法一:
#include <iostream> #include <ctime> #define N 10 using namespace std; int maxxunhuan(int array[N] , int n){ int i,j = 0,m,c = 0; int sum = array[0],b = 0,max = 0; for(j = 0;j < n;j++){ b = 0; for(i = j;i < n;i++){ if(i < n-1){ if(b > 0){ b += array[i]; m = i; } else b = array[i]; if(b > sum) sum = b; } if(i == n-1){ b = b + array[i]; for(c = 0;c < j;c++){ if(b > 0) b += array[c]; else b = array[c]; if(b > sum) sum = b; } } } if(sum >max) max = sum; } return sum; } int main(){ int array[N]; int i; memset(array,0,sizeof(array)); //初始化一维数组 cout<<"随机生成的一维数组为的:"<<endl; srand((unsigned)time(0)); for(i = 0;i < N;i++){ array[i] = rand()%25-10; cout<<array[i]<<'\t'; } cout<<"最大循环子数组为:"<<endl; cout<<maxxunhuan(array , N); return 0; }
1
编程思想:
用srand随机生成一维数组。
如:1 , 14 , -9 , -1 , 6 , 6, -2, 3, -9, 4
第一次循环是从1 , 14 , -9 , -1 , 6 , 6, -2, 3, -9, 4
第二次循环是从14 , -9 , -1 , 6 , 6, -2, 3, -9, 4, 1
第三次循环是从-9 , -1 , 6 , 6, -2, 3, -9, 4, 1, 14
。。。。
第n次循环是从。。。
用变量j来控制循环的次数,有n个数就有n个循环。
在每次循环中,参考返回一维数组最大子数组的方法,求出每一次循环中的最大子数组sum,然后用max来表示总循环中最大的那个子数组
时间复杂度o(n2).
方法二:
#include <iostream> #include <ctime> #define N 10 using namespace std; int maxxunhuan(int array[2*N] , int n){ int i,j,m = 0,c = 0; int sum = array[0],b= 0,max = 0; for(j = 0;j < n;j++) array[n+j] = array[j]; for(j = 0;j < n;j++){ b = 0; sum = 0; for(i = j;i < 2*n;i++){ if(b > 0) b += array[i]; else{ b = array[i]; c = i; } if(b > sum ){ m = i; if(m > c+n-1) break; else sum = b; } } if(sum > max) max = sum; } return max; } int main(){ int array[2*N]; int i; memset(array,0,sizeof(array)); //初始化一维数组 cout<<"随机生成的一维数组为的:"<<endl; srand((unsigned)time(0)); for(i = 0;i < N;i++){ array[i] = rand()%25-10; cout<<array[i]<<'\t'; } cout<<"最大循环子数组为:"<<endl; cout<<maxxunhuan(array , N); return 0; }
方法二:
上课的时候听了我同学的一个方法课下进行了改进。在于把数组复制变成一个长度为原来二倍的数组,然后按照一维数组求最大子数组的方法求解。需要注意的是要保证子数组的长度应小于等于n。
同时还应该注意的是这里的时间复杂度还是o(n2).如果只照搬按照一维数组求解的方法我们可以求出长度小于等于n的一个子数组,但是可能却并不是最大。
比如 1 -1 1 2 12 8 -8 10 0 10
复制之后为 1 -1 1 2 12 8 -8 10 0 10 1 -1 1 2 12 8 -8 10 0 10
最大的为从10 0 10 1 -1 1 2 12 8 最大值应为43
可是如果只按照照搬按照一维数组求解的方法求解的结果为1 -1 1 2 12 8 -8 10 0 10,值为35
明显的不对的,原因在于数组长度限制在n,而他又是从a[0]开始加且加的过程中由满足一维数组求最大子数组的条件求出来的知识a[0]---a[9]的最大子数组,并非a[0]---a[19]的最大子数组。所以还要另外设一个变量j循环
第一次是从1 -1 1 2 12 8 -8 10 0 10
第二次是从-1 1 2 12 8 -8 10 0 10 1
第三次是从1 2 12 8 -8 10 0 10 1 -1
。。。。。
求出a[0]---a[19]的最大字数字
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端