看题目感觉是动态规划
然后列举分析一下,发现 过程中有些结果是重叠的
规律为 nums中索引为n的数,其子数组最大值为 Math.max(索引为 n-1的最大子数组加上自己本身(数组中该索引本身的数),自己本身)
得出:
初始状态:f0 = nums[0]
转移方程:fn+1 = fn + nums[n+1] 或 fn+1
fn = fn-1 + nums[n] 或 fn
最优子结构:fn
/** 到索引为n的数,其子数组最大值为 索引为 Math.max(n-1的最大子数组加上自己,自己本身)*/
public int maxSubArray(int[] nums) {
/** 初始状态:f0 = nums[0]
* 转移方程:fn+1 = fn + nums[n+1] 或 fn+1
fn = fn-1 + nums[n] 或 fn
* 最优子结构:fn*/
int[] max = new int[nums.length];
int result = nums[0];
for (int i = 0; i <= nums.length-1; i++){
if (i == 0) max[0] = nums[0];
else {
max[i] = Math.max(max[i-1] + nums[i],nums[i]);
result = Math.max(max[i],result);//将当前索引的最大值和之前最大值比较,放入结果中
}
}
return result;
}