题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整型数组,数组里有正数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值。要求时间复杂度为O(n);
一、设计思想
1.首先随机产生一个数组,数组长度可自行输入,该数组里有正数也有负数。
2.从数组中第一个元素a[0]开始,依次计算a[0]、a[0]+a[1]、a[0]+a[1]+...+a[i]的值,即从a[0]开始的每个子数组的和,取出最大值。
3.再从数组第二个元素a[1]开始,依次往后计算每个子数组的和,取出最大值。
4.依次循环,循环num次,直到数组最后一个元素,将每次求得的最大值存到一个数组list[]中。
5.比较每次得出的子数组的和的最大值,再得出最大值。
二、源程序
1 //作者:王雪青 陆宇 2 //日期:2015年3月18日 3 package com.java.lianxi; 4 5 import java.util.*; 6 public class lianxi2 7 { 8 public static void main(String[] args) 9 { 10 Scanner input=new Scanner(System.in); 11 System.out.print("请输入数组中数的个数:"); 12 int num=input.nextInt(); 13 int array[]=new int[num]; 14 for(int i=0;i<num;i++) 15 { 16 if((int)(Math.random()*2)==0) 17 { 18 array[i]=(int)(Math.random()*10); 19 } 20 else 21 { 22 array[i]=-(int)(Math.random()*10); 23 } 24 } 25 for(int i=0;i<num;i++) 26 { 27 System.out.println(array[i]); 28 } 29 int max=0; 30 int list[]=new int[num]; 31 for(int j=0;j<num;j++) 32 { 33 max=array[j]; 34 int sum=0; 35 for(int t=j;t<num;t++) 36 { 37 sum=sum+array[t]; 38 if(sum>max) 39 { 40 max=sum; 41 } 42 } 43 list[j]=max; 44 } 45 for(int i=0;i<num;i++) 46 { 47 System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:"); 48 System.out.println(list[i]); 49 } 50 for(int i=1;i<num;i++) 51 { 52 max=list[0]; 53 if(list[i]>max) 54 { 55 max=list[i]; 56 } 57 } 58 System.out.print("子数组和的最大值为:"+max); 59 } 60 } 61
三、运行结果截图:
四、心得体会和总结
我们组的两个人是我王雪青和陆宇,这个题目的实现方法是陆宇想到的,然后程序是由我编写的,程序中的问题是我们两个一起解决的。这个程序基本实现了题目中的要求,但是时间复杂度不满足要求,今后我们会对这方面做改进,使程序更加完善。
时间: 2024-12-21 02:40:31