题目描述
给你一个整数数组 arr,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
思路:滑动窗口
public class MaxSubArr {
public static void main(String[] args) {
int[] arr = {1,-2,3,10,-4,7,2,-5};
int res = maxSubArr(arr);
System.out.println(res);
}
private static int maxSubArr(int[] arr) {
int res = arr[0];
int sum = 0;
for (int i = 0; i < arr.length; i++) {
// 条件
if (sum >= 0) {
// 扩张
int val = arr[i];
sum += val;
res = Math.max(sum, res);
} else {
// 滑动
sum = arr[i];
res = Math.max(sum, res);
}
}
return res;
}
}
1、窗口扩张的条件:sum >=0(如果你为负数,我就不需要你了,和你在一起只会让我变得更小)
2、扩张动作:
- i ++
- sum累加
- 记录下res
3、滑动动作:
- sum = arr[i]:i自立门派
- -记录下res