题目:返回一个整形数组中最大子数组的和
要求:
- 输入一个整形数组,数组中有正数也有负数。
- 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
- 求所有子数组的和的最大值,要求时间复杂度为O(n)
设计思路:
- 方法一:用两个for循环返回最大子数组的和sum,与max比较,当sum>max时,交换值,最终返回max的值,但是时间复杂度达不到O(n)
- 方法二;先遍历数组,找到第一个大于零的数star;从star开始利用for循环求出sum,当sum<0时,令sum=0继续循环;当最终出现sum=0的情况时,遍历一遍返回数组中最大的数(全是负数的情况下会返回0,应该返回最大的负数才对)。
遇到的问题:
- 开始运用方法二时,输入-8,9,0三个数时会返回1;后来加入star跳过前面的负数解决了此问题。
- 全输入负数会返回0;后来加入一段代码当max返回0时再求一遍数组中的最大值。
源代码
package q_002; import java.util.Scanner; public class q_1606{ static Scanner sc=new Scanner(System.in); static float d=Float.NEGATIVE_INFINITY; public static void main(String[] args) { //输入数组长度 int n; System.out.println("请输入数组的长度"); n=sc.nextInt(); //输入数组 int[] a=new int [n]; System.out.println("请输入"+n+"个 整数"); for(int i=0;i<n;i++) { a[i]=sc.nextInt(); } //显示数组内容 System.out.println("输入的数组为:"); for(int i=0;i<n;i++) { System.out.println(a[i]+" "); } /*int arr[] = { 2, -3, 4, 11, -5, 8, 3, -6 };*/ //调用函数输出结果 int maxSum = getMaxSum(a); System.out.println("最大子数组的和为:" + maxSum); } //方法一 private static int getMaxSum(int[] a) { int n = a.length; int max1 =(int) d;//令最大值等于无穷小 for (int i = 0; i < n; i++) { int sum = 0; for (int j = i; j < n; j++) { sum += a[j]; if (max1 < sum) { max1 = sum; } } } return max1; } // 方法二 private static int getMaxSum2(int[] a) { int n = a.length; int max =(int) d; int sum = 0; int star = 0; for (int j =0 ; j < n; j++) {//如果前面的数是负数则跳过 while(a[j]>0) { star=j; } } for (int i=star ; i < n; i++) { sum += a[i]; if (sum > max) { max = sum; } if (sum < 0) { max = 0; // 子串和为负数,丢掉 } } return max; } /* //方法三 private static int getMaxSum3(int[] a) { int sum = 0; int max=-1000000; for(int i=0;i<arr.length;i++) { sum += arr[i]; if(sum>max) { max=sum; } if(sum<0) { max=0; } return max; } } */ }
运行结果: