描述
给定一个数组,求得这个数组中最大的字串和:
例如:
int[] arr = {1, -2, 3, 5, -2, 6, -1};
其中最大和的字串为:
3, 5, -2, 6
思路:
开始拿到这种题目的时候会想到暴力解决的方法,即遍历所有子数组的情况,虽然也能解决,但是这样解决复杂度为O(n^2)所以想了另外一种想法;
- 遍历这个数组,设置一个初始值sum存放第一个元素,每次遍历的时候判断这个数是否是大于0的,如果是,就可能为后面的数做出贡献,于是就将其保存下来,并将本轮数据相加,在这过程中不断维护一个最大的数;最终求得这个最大的数。
代码:
public class 最大子数组 {
public static void main(String[] args) {
int[] arr = {1, -2, 3, 5, -2, 6, -1};
int max = gatMax(arr);
System.out.println(max);
}
//3,5,-2,6
private static int gatMax(int[] arr) {
int sum = arr[0];
int max = sum;
//如果当前一个加上后一个的数字为大于0就将其带上,并和后面的数字下相加是否最大,并动态的保存当前最大的
//如果是小于零的就将其区间移动到下一处
for (int i = 1; i < arr.length; i++) {
if (sum > 0) {
sum += arr[i];
}else{
sum = arr[i];
}
//维护最大的数
if(max < sum){
max = sum;
}
}
return max;
}
}