题目是:
尝试了第一遍…好菜啊…
代码如下
class Solution {
public int maxSubArray(int[] nums) {
List<Integer> subList = new ArrayList<>();
int state = 0;
int max = 0;
for(int i=0;i<nums.length;i++){
for(int j=0;j<nums.length;j++){
if (i==j){
state = nums[i];
max = nums[i];
}
else {
state +=nums[j];
}
if (max<state){
max = state;
}
}
subList.add(max);
}
int result = subList.get(0);
for (int i=0;i<subList.size();i++){
if (subList.get(i)>result){
result=subList.get(i);
}
}
return result;
}
}
看看解析,改了改代码,时间上提升了很多,空间上还是一样菜。
class Solution {
public int maxSubArray(int[] nums) {
if (nums == null) {
return 0;
}
int max = nums[0]; // 全局最大值
int subMax = nums[0]; // 前一个子组合的最大值,状态压缩
for (int i = 1; i < nums.length; i++) {
if (subMax > 0) {
// 前一个子组合最大值大于0,正增益
subMax = subMax + nums[i];
} else {
// 前一个子组合最大值小于0,抛弃前面的结果
subMax = nums[i];
}
// 计算全局最大值
max = Math.max(max, subMax);
}
return max;
}
}
动态规划:
动态规划的解题核心主要分为两步:
第一步:状态的定义
第二步:状态转移方程的定义
那么这道题则可以分解为:
附上我的python
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
maxSum=nums[0]
for i in range (1,n):
#正向累加获得最大值
if nums[i-1]>0:
nums[i]+=nums[i-1]
maxSum=max(nums[i],maxSum)
return maxSum