要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
设计思想:
数组中有正有负,子数组的和最大值就不一定是元素个数最多的那个子数组。所以开始从0遍历,先求两个元素的子数组的最大值,然后以此类推,通过比较,if判断,把最大值赋给max。
代码:
import java.util.Scanner;
public class shuzu {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入数字的数量:");
int n=scanner.nextInt();
int[] a=new int[n];
System.out.println("请输入数组的数值:");
for(int i=0;i<n;i++){
a[i]=scanner.nextInt();
}
for(int i=1;i<n;i++){
if(a[i]+a[i-1]>a[i])
a[i]=a[i]+a[i-1];
}
int ans=-1000;
for(int i=0;i<n;i++)
{
if(a[i]>ans)
ans=a[i];//找取最大值
}
System.out.println(ans);
}
}
截图:
总结:
求一个最大子数组和,看似简单,其实不然。通过这个实验,练习了算法。我觉得算法难的地方是思路,思路清晰了写起来会好很多。