LeetBook刷题笔记016:最大子数组和(Java实现)
题目
给你一个整数数组
nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。
自己的解-动态规划
-
超时
-
dp[i]表示nums数组在区间[0,i]的最大和连续子数组
public static int maxSubArray(int[] nums) {
int n = nums.length;
if (n == 1)
return nums[0];
int[] dp = new int[n];
dp[0] = nums[0];
for (int i = 1; i < n; i++) {
//排除特殊情况提升效率
if (nums[i] < 0 && nums[i] <= dp[i - 1]) {
dp[i] = dp[i - 1];
continue;
}
if (dp[i - 1] <= 0 && nums[i] >= 0) {
dp[i] = nums[i];
continue;
}
//不断获取以i结尾的子数组将其和与dp[i-1]进行对比
int max = dp[i - 1];
int temp = 0;
for (int t = i; t >= 0; t--) {
temp += nums[t];
if (temp > dp[i - 1] && temp > max)
max = temp;
}
dp[i] = max;
}
return dp[n - 1];
}
最优解-动态规划-移动数组
- dp[i]表示以i结尾的最大子数组
- 最大子数组和即为dp数组最大值元素
- dp数组的定义不一定能直接获取结果,但是一定能推导出结果
public static int maxSubArray(int[] nums) {
int n = nums.length;
if(n == 1)
return nums[0];
//dp[i]推导只需要dp[i-1]和nums[i]
//则可以使用移动数组提升空间性能
int a = nums[0];
int max = nums[0];
for(int i=1;i<n;i++){
a = Math.max(nums[i],a+nums[i]);
if(a>max)
max = a;
}
return max;
}