个人作业1-数组
题目:返回一个整数数组中最大子数组的和。
要求: 输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
设计思路:首先创建一个数组,生成随机数。
将数组里的数字相加,将相加的结果与第二个数作比较,如果大于第二个数,则继续相加
反之,则放弃前面的数字,与后面的数字相加,以此类推
1 package 数组和; 2 import java.util.Scanner; 3 public class A { 4 public static int getMax(int arr[]){//定义一个函数求数组中最大子数组和 5 int maxSum=arr[0]; 6 int temp=0;//用来存储连续子数组的和 7 for(int i=0;i<arr.length;i++) 8 { 9 if(temp<0) 10 { 11 temp=arr[i];//当子数组的和为负数时直接抛弃并把当前数字赋给它 12 if(temp>0&&maxSum<temp )//当temp小于0后出现第一个大于0的temp时且大于原来的maxsum赋值 13 {maxSum=temp;}//一开始没写该语句当输入1,-2,4的时候输出1出现逻辑错误 14 } 15 else 16 { 17 temp+=arr[i];//如果连续数字和为正则继续加下去 18 if(maxSum<temp) 19 { 20 maxSum=temp;//当现有连续数字和大于之前最大连续数字和时更新最大值 21 } 22 } 23 } 24 return maxSum; 25 } 26 public static int max(int arr[]){ 27 int max=arr[0]; 28 for(int i=0;i<arr.length;i++) 29 { 30 if(max<arr[i]) 31 { 32 max=arr[i]; 33 } 34 } 35 return max; 36 } 37 public static void main(String[] args){ 38 int []array=new int[100]; 39 System.out.println("请输入要求解的数组个数:"); 40 @SuppressWarnings("resource") 41 Scanner reader=new Scanner(System.in); 42 int n=reader.nextInt(); 43 System.out.println("请输入要求解的数组:"); 44 int[] result=new int[array.length]; 45 for(int i=0;i<n;i++) 46 { 47 array[i]=reader.nextInt(); 48 } 49 for(int i=0;i<array.length;i++) 50 { 51 int temp=array[0]; 52 for(int i1=0;i1<array.length-1;i1++) 53 { 54 array[i1]=array[i1+1]; 55 } 56 array[array.length-1]=temp; 57 result[i]=getMax(array); 58 } 59 int r=max(result); 60 System.out.println("最大子数组和为:"+r); 61 } 62 }
总结:这道题比较难的就是理清思路