Leetcode 53. 最大子数组和

155 阅读1分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

  • 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。

二、思路分析

  • 子数组是数组中连续的部分

  • 这题我们采用分治法来解题

  • 将数组分成最小的组合

  • 在进行左侧和右侧以及左右相加值的比较,最终合并出连续子数组

三、AC 代码:

class Solution {
    public int maxSubArray(int[] nums) {
      return getMaxSub(nums,0,nums.length - 1);
    }

    private int getMaxSub(int [] nums,int left,int right){
        if(left == right){
            return nums[left];
        }
        int mid = left + (right - left)/2;
        int leftMax = getMaxSub(nums,left,mid);
        int rightMax = getMaxSub(nums,mid+1,right);
        int crossMax = getCrossMax(nums,left,right);
        return Math.max(crossMax,Math.max(leftMax,rightMax));
    }

    private int getCrossMax(int[] nums,int left,int right){
        int mid = left + (right - left)/2;
        int leftNum = nums[mid];
        int leftMax = leftNum;
        for(int i = mid - 1;i>=left;i--){
            leftNum += nums[i];
            leftMax = Math.max(leftNum,leftMax);
        }
        int rightNum = nums[mid+1];
        int rightMax = rightNum;
        for(int i = mid+2;i<=right;i++){
             rightNum += nums[i];
            rightMax = Math.max(rightMax,rightNum);
        }
        return leftMax+rightMax;
    }

   

  
}

四、总结:

  • 好了,代码撸完,我们总结一下
    • 递归,分治

    • 左侧的最大值是指从中线开始向左累加的最大值

    • 左侧的最大值是指从中线开始向右累加的最大值

    • 最后和左右相加和进行比较,得出最大子数组

最后这个算法是Leetcode的第53题,是热题100里的题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点赞关注,如果你也在刷热题100的话,希望可以对你有一些启发!