“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;
}
}
四、总结:
- 好了,代码撸完,我们
总结一下
:-
递归,分治
-
左侧的最大值是指从中线开始向左累加的最大值
-
左侧的最大值是指从中线开始向右累加的最大值
-
最后和左右相加和进行比较,得出最大子数组
-