您的位置:首页 > 其它

leetcode做题总结,动态规划II(Maximum Subarray, Maximum Product Subarray)

2015-01-08 04:15 351 查看
这两道题都作出来了,但是代码冗长,于是我上网搜了一下,发现了非常简洁的做法,特此链接
http://blog.csdn.net/linhuanmars/article/details/21314059 http://blog.csdn.net/linhuanmars/article/details/39537283
主要思路是不使用矩阵,使用local和global变量来记录包含当前元素的局部最优解和到目前为止的全局最优解。

public int maxSubArray(int[] A) {
if(A==null || A.length==0)
return 0;
int global = A[0];
int local = A[0];
for(int i=1;i<A.length;i++)
{
local = Math.max(A[i],local+A[i]);
global = Math.max(local,global);
}
return global;
}


public class Solution {
public int maxProduct(int[] A) {
if(A==null || A.length==0)
return 0;
if(A.length == 1)
return A[0];
int max_local = A[0];
int min_local = A[0];
int global = A[0];
for(int i=1;i<A.length;i++)
{
int max_copy = max_local;
max_local = Math.max(Math.max(A[i]*max_local, A[i]), A[i]*min_local);
min_local = Math.min(Math.min(A[i]*max_copy, A[i]), A[i]*min_local);
global = Math.max(global, max_local);
}
return global;

}
}


下面是我对第一题的解法,复杂度一样就是代码冗长

public class Solution {
public int maxSubArray(int[] A) {
if(A.length==0) return 0;
int max=A[0],record=0;
boolean tmp=false;
for(int i=0;i<A.length-1;i++){
if(!tmp&&max<=0&&A[i]>max)max=A[i];
if(!tmp&&A[i]>0){
//start=i;
record=0;
tmp=true;

}

if(tmp&&((record+A[i]+A[i+1])>=0)){
record+=A[i];
max=max>record?max:record;
}else if(tmp&&((record+A[i]+A[i+1])<0)){
record+=A[i];
max=max>record?max:record;
record=0;
tmp=false;
}

}
if(tmp){
record+=A[A.length-1];
max=max>record?max:record;
}else{
max=max>A[A.length-1]?max:A[A.length-1];
}
return max;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: