53. 最大子数组和(力扣-java)

给你一个整数数组 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

提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104

思路:以下列代码第一种为例
(1)先用sum(起始为num[0])记录前 i-1 个元素中连续子数组最大和,即记录是否对第 i 个数据是否有增益。
(2)当sum>0时,说明 i 位置前面连续子数组值和为正,则 对于i 位置数据是有增益的,如果没有增益直接pass,令sum = nums[i]

(可能有的人不明白为什么令sum = nums[i],举个例子:当增益sum = -1,nums[i] = 2,nums[i]加上增益sum肯定变小了,那不如直接让sum为nums[i])使得比sum = sum + nums[i](sum = -1 + 2 = 1)更大

(3)max默认最大增益为nums[0],将sum与max比较,较大的增益复制给max,最后返回max
代码:

//第一种:
class Solution {
public int maxSubArray(int[] nums) {
        int sum = nums[0];
        //首先默认首元素为和最大值
        int max = nums[0]; 
        for(int i = 1; i < nums.length;i++){
            //如果当前i位置的前i-1个数和>0
            //则说明此时对该位置数有增益
            if(sum > 0){
                sum = sum + nums[i];
            }else {//如果为负数,则会使当前数字减小,则最大的还是当前数字
                sum = nums[i];
            }
            max = Math.max(sum,max);
        }
        return max;
    }
}

//第二种
class Solution {
     public int maxSubArray(int[] nums){
         int[] dp = new int[nums.length];
         dp[0] = nums[0];
         int max = nums[0];
         for(int i = 1; i < nums.length;i++){
         //dp[i]记录前i-1个数据中连续子数据中最大值
            dp[i] =Math.max( dp[i-1] + nums[i],nums[i]);
            max = Math.max(dp[i],max);
         }
          return max;
     }
 }



你可能感兴趣的:(刷题,leetcode,算法)