一、题目:
返回一个整数数组中最大子数组的和。
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
首先将每一点看成辐射源,没点只能向右辐射找出所有可能的子数组求出最大值,如arr[5]={1,2,3,4,5}。首先1与1+2与1+2+3....到1+2+3+4+5找出最大值存入数组a[0]中。
再由2向右辐射找出所有可能的子数组求出最大值存入a[1]以此类推直至最后。在求出a[5]中最大值即为此数组最大子数组的和的最大值
三、代码
package com.minirisoft; import java.util.*; class SuperMax { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int[] list = new int[10];//输入数组是必须先定义数组,否则出错! int[] arr1 = new int[10];//输入数组是必须先定义数组,否则出错! System.out.println("请输入数组:"); for(int k=0;k<10;k++) { list[k]=sc.nextInt(); } for(int n=0;n<9;n++) { arr1[n]=list[n]; for(int m=n;m<9;m++) { arr1[m+1]=arr1[m]+list[m+1]; } for(int m=n;m<10;m++) { if(arr1[m]>arr1[n]) { arr1[n]=arr1[m]; } } System.out.println("从第"+n+1+"个元素辐射的最大子数组的和为"+arr1[n]); } arr1[9]=list[9]; for(int i=0;i<10;i++) { if(arr1[i]>arr1[0]) { arr1[0]=arr1[i]; } } System.out.println("最大子数组的和为"+arr1[0]); } }
四、实验截图
五、实验体验
有时候突发的灵感比苦做编程一天都重要。此次简单20分钟的编程41行代码完胜上个实验的8个小时