题目描述:
标签:数组 分治算法 动态规划
给定一个整数数组
nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
代码:
《一、贪心算法》
思路分析:
1、贪心算法的思想(在数据结构算法课上其实叫的是在线处理):就是定义一个当前和thisSum和最大和maxSum,
①当thisSum>maxSum时,可以令maxSum=thisSum的,不过这里需要注意maxSum的初始值不能是0,因为有可能所有子列都是负数,所以初始值应该定义成整型的最小值Integer.MIN_VALUE
②当出现thisSum<0时是不能使后面部分和增大的,所以抛弃前面的子列!令thisSum=0,重新开始统计。
class Solution {
public int maxSubArray(int[] nums) {
int thisSum = 0;
int maxSum = Integer.MIN_VALUE;
for(int i = 0;i < nums.length;i++){
thisSum += nums[i];
if(thisSum > maxSum){
maxSum = thisSum;
}
if(thisSum < 0){
thisSum = 0;
}
}
return maxSum;
}
}
《二、动态规划》
思路分析:动态规划五部曲
1、确定dp数组以及下标含义,dp[i]表示前i个数构成的数组的最大连续子序列的和
2、确定递推公式,dp[i]=max(dp[i-1]+nums[i],nums[i]),看是继续在之前的基础上增加,还是从当前重新计和
3、dp数组初始化,dp[0]=nums[0]
4、确定遍历顺序,从前向后遍历
5、举例推导dp数组
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
int result = dp[0];
for(int i = 1;i < n;i++){
dp[i] = Math.max(dp[i-1]+nums[i],nums[i]);
if(dp[i] > result) result = dp[i];
}
return result;
}
}