题目:返回一个整形数组中最大子数组的和
要求:
- 输入一个整形数组,数组中有正数也有负数。
- 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
- 求所有子数组的和的最大值,要求时间复杂度为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;
}
}
*/
}
运行结果: