一、题目
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
二、思路
1)暴力破解
2)动态规划
通过推倒可以得到状态转移方程为:dp[i]=Math.max(dp[i - 1] + nums[i], nums[i])
三、实现
1)
public int maxSubArray(int[] nums) {
if (nums.length == 0) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
int sum = 0;
for (int j = i; j < nums.length; j++) {
sum += nums[j];
max = Math.max(max, sum);
if (sum <= 0) {
break;
}
}
}
return max;
}
2)
public int maxSubArray(int[] nums) {
int len = nums.length;
int[] dp = new int[len];
if (len == 0) {
return 0;
} else if (len == 1) {
return nums[0];
}
dp[0] = nums[0];
int max = nums[0];
for (int i = 1; i < len; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
if (max < dp[i]) {
max = dp[i];
}
}
return max;
}