题目描述
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
分治法代码:
#include<iostream>
using namespace std;
/*
9
-2 1 -3 4 -1 2 1 -5 4
*/
int MaxSum(int a[],int left,int right){
int sum=0,midSum=0,leftSum=0,rightSum=0;
int center,s1=0,s2=0,lefts=0,rights=0;
if(left==right){
sum=a[left];
}else{
center=(left+right)/2;
leftSum=MaxSum(a,left,center);
rightSum=MaxSum(a,center+1,right);
for(int i=center;i>=left;--i){
lefts+=a[i];
if(lefts>s1){
s1=lefts;
}
}
for(int j=center+1;j<=right;++j){
rights+=a[j];
if(rights>s2){
s2=rights;
}
}
midSum=s1+s2;
sum=midSum>leftSum?midSum:leftSum;
sum=sum>rightSum?sum:rightSum;
}
return sum;
}
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;++i){
cin>>a[i];
}
cout<<MaxSum(a,0,n-1);
return 0;
}
分治法运行截图:
动态规划代码:
class Solution {
public int maxSubArray(int[] nums) {
int maxSum = nums[0];
int[] dp = new int[nums.length];
dp[0] = nums[0];
for (int i = 1; i < nums.length; ++i) {
dp[i] = dp[i - 1] > 0 ? dp[i - 1] + nums[i] : nums[i];
maxSum = Math.max(maxSum, dp[i]);
}
return maxSum;
}
}
动态规划leetcode提交记录:
leetcode地址:
https://leetcode-cn.com/problems/maximum-subarray/
版权声明:本文为weixin_45953673原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。