这几天为了准备wap的tech interview,无意间看到了leetcode OJ,上面目前有150多道题目,粗粗浏览了一下都是质量较高的算法题,突然有了一种大一时候ACM的感觉,虽然很多都不熟悉了,还有一些从来没熟悉过...不过现在开始就是最好的时机~wap失败了还有其他国内公司的机会~
第四题: 求最大的子序列乘积
开始的时候误入歧途,没有想到DP,currentMax和currentMin从单值变成数组问题就迎刃而解了,因为一路乘下去,下一刻只要不是当前最大(对应乘积为正)一定就是当前最小(对应乘积为负),DP方程可以这么写max(i) = max{ ai , ai * max( i - 1 ) , ai * min( i - 1 ) }, min(i) = min{ ai , ai * max( i - 1 ) , ai * min( i - 1 ) },源代码如下:
public class Solution {
public int maxProduct(int[] A) {
int currentMax[] = new int[99999];
int currentMin[] = new int[99999];
currentMax[0] = A[0];
currentMin[0] = A[0];
int value = currentMax[0];
for(int i=1;i<A.length;i++)
{
currentMax[i] = max(max(currentMax[i-1]*A[i],A[i]),currentMin[i-1]*A[i]);
currentMin[i] = min(min(currentMax[i-1]*A[i],A[i]),currentMin[i-1]*A[i]);
value = max(currentMax[i],value);
}
return value;
}
public int max(int a,int b){
if(a>b)return a;
else return b;
}
public int min(int a,int b){
if(a<b)return a;
else return b;
}
}