一个数组内有正数和负数,而且数组是循环的。求数组内最大子数组的和。要求数组是算法空间复杂度为O(1)。
思路:
1.求出每个子数组的值,比较大小。
2.定义一个参数,为数组的长度。
3.构造另外的数组,使得是原数组的得到两个集合。比如a={1,2,3,4}.b={1,2,3,4,1,2,3,4};
4.这样可以满足数组的循环,参数为原数组的长度。
代码如下:
package zuida; import java.io.*; import java.util.Scanner; class qiu { public int shuchu(int a,int l,int f[],int x) { int m[]=new int[l*(l+1)/2]; m[0]=f[a]; a=a+1; int b=1,s=0; for(int i=a;i<x+s;i++)//从第一位开始循环,控制循环长度 { if(i==x-1)//如果循环到最后一位 { m[b]=m[b-1]+f[i]; i=a+s;//从原数组的下一位开始 s++;//起始位置加1 b++; m[b]=f[i]; b++; } else//如果没有到最后一位 { m[b]=m[b-1]+f[i];//将每一位都求和累加,求出每个子数组的和,保存在数组m中 b++; } } int t=m[0]; for(int i=1;i<l*(l+1)/2;i++) { if(t<m[i]) { t=m[i]; } } return t; } } public class shu { public static void main(String[] args) { // TODO 自动生成的方法存根 int f[]={1,2,-3,0,7,-8,4};//原数组 int ff[]={1,2,-3,0,7,-8,4,1,2,-3,0,7,-8,4};//构造的循环数组。使得可以循环 int n=7; int s[]=new int[n]; qiu m=new qiu(); int t=m.shuchu(0,2*n,ff,n);//调用类的函数,第一个参数为起始位置,第二个为数组的长度,最后一个参数原数组的长度 System.out.println("最大子数组的和为:"+t);//输出最大值 } } ;
结果图:
项目计划总结
任务 日期(min) |
听课 |
阅读课 本 |
编程 |
准备考 试 |
日总计 |
||
周日 |
|||||||
星期一 |
160 |
|
70 |
70 |
|||
星期二 |
|
150 |
150 |
||||
星期三 |
120 |
120 |
|||||
星期四 |
80 |
80 |
|||||
星期五 |
60 |
60 |
|||||
星期六 |
70 |
70 |
|||||
周总计 |
时间记录日志
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
|
3月27日 |
18:40 |
21:00 |
10min |
70min |
听课,编程 |
四则运算网页版 |
3月28日 |
19:10 |
21:30 |
10min |
110min |
编程 |
四则运算网页版 |
3月29日 |
19:20 |
21:20 |
10min |
110min |
阅读 |
四则运算网页版 |
3月30日 |
19:00 |
21:00 |
20min |
100min |
编程 |
四则运算网页版 |
3月31日 |
16:00 |
17:30 |
90min |
编程 |
四则运算网页版 |
|
4月1日 |
18:30 |
21:30 |
10min |
110min |
错误总计
3月28日 |
无法正确跳转页面, |
3月29日 |
不能实现一些参数的传递 |
3月30日 |
数组库调取错误 |
3月31日 |
页面的优化 |