解法1
思路
- 数组中的每个元素 依次 作为子序的头元素 ,枚举各自构成子序的结果
- 双for O(n^2)
- 160 ms
代码
/**
* 双for O(n^2) 160ms
* @param nums
* @return
*/
public int maxSubArray(int[] nums) {
int ans=nums[0],len=nums.length;
for(int i=0;i<len;i++){
int sum=nums[i];
ans=Math.max(ans, sum);
for(int j=i+1;j<len;j++){
sum+=nums[j];
ans=Math.max(ans, sum);
}
}
return ans;
}
优解 (动态规划)
思路
作者:lizhiqiang-3
代码
/**
* 动态规划
* 1ms O(n)
* @param nums
* @return
*/
public int maxSubArray2(int[] nums){
int len=nums.length;
if(len==0) return 0;
int[] dps=new int[len];
dps[0]=nums[0];
for(int i=1;i<len;i++){
if(dps[i-1]>=0){
dps[i]=dps[i-1]+nums[i];
}else{
dps[i]=nums[i];
}
}
int ans=dps[0];
for(int dp:dps){
ans=Math.max(ans, dp);
}
return ans;
}
优化
/**
* 优化
* @param nums
* @return
*/
public int maxSubArray3(int[] nums){
int len=nums.length;
if(len==0) return 0;
int max=nums[0];
int subMax=nums[0];
for(int i=1;i<len;i++){
if(subMax>=0){
subMax=subMax+nums[i];
}else{
subMax=nums[i];
}
max=Math.max(max, subMax);
}
return max;
}