问题描述
一个整数数组中的元素有正有负,在该数组中找出一 个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。问题输入就是一个数组,输出该数组的“连续子数组的最大和”。
想法:看了大多数人的思路,无非分为三种方法:分治法,动态规划,暴力破解(时间复杂度高容易超时)
然后呢就我自己感觉,感觉不是很容易懂,可能是我太笨了QAQ,然后自己写了下,也算是动态规划吧,但是比较容易懂
具体思路:不管是哪一组数组,都会有正有负(当然全负全正也要考虑进去,而且比较容易实现,在这里就不讨论了),就从这组数组里面第一个大于0的1数字开始累加,比sub大的就赋值给sub(最大部分组),小的就继续加。。。中途比较大小,直到数组最后一个值,最终能确定最大的sub。
具体代码:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scan.nextInt();
}
System.out.println(f(arr,n));
}
private static int f(int[] arr, int n) {
int sum = 0;
int num = 0;
//判断首个大于零的arr[i]
while(arr[num]<0) {
num++;
if (num == n-1) {
return 0;
}
}
int sub = arr[num];//暂定sub值为首个大于0的arr[i];
for (int i = num; i < n; i++) {
sum += arr[num];
num++;
if (sum>sub) {
sub = sum;
}
}
return sub;
}
}