题目描述:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 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
思路:
使用res记录和,maxSubArray来记录最大和,通过这两个变量的比较确定最大和
当res < 0 时,此时res与数组后面的元素求和一定不是最大值
只有当 res > 0 时,和数组后的元素求和可能得到最大值
public class 最大子数组和 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = {
-5219,-8112,-5817,1798,-5300,5168,-1066,9982,-790,9086,-6323,8303,6269,193,-8171,-5086,-227,9953
};
int a = maxSubArray(arr) ;
System.out.println(a) ;
}
public static int maxSubArray(int[] nums) {
//方法一: 最复杂的方法
// int maxSubArray = nums[0] ;
// int SubArray ;
// for(int i = 0 ; i < nums.length ; i ++ ) {
// SubArray = nums[i] ;
// if(SubArray > maxSubArray) {
// maxSubArray = SubArray ;
// }
// for(int j = i + 1 ; j < nums.length ; j ++ ) {
// SubArray += nums[j] ;
// if(SubArray > maxSubArray) {
// maxSubArray = SubArray ;
// }
// if(j == nums.length - 1 ) {
// SubArray = 0 ;
// }
// }
// }
// return maxSubArray ;
//方法二:
int maxSubArray = nums[0] , res = nums[0] ;
for( int i = 1 ; i < nums.length ; i ++ ) {
//优化这部分代码
// if( res < 0 && nums[i] > 0 ) {
// res = nums[i] ;
// } else if (res <= 0 && nums[i] <= 0 ){
// if(res < nums[i] ) {
// res = nums[i] ;
// }
if( res < 0 ){
if( res < nums[i] ) {
res = nums[i] ;
}
}else{
res += nums[i] ;
}
if ( maxSubArray < res ) {
maxSubArray = res ;
}
}
return maxSubArray ;
}
}