leetcode 152 O(n)解决方案

来源:互联网 发布:淘宝软件下载电脑版 编辑:程序博客网 时间:2024/06/06 12:47

题目大意:寻找一个子序列,使其乘积达到最大。
解决思路:记f[i]为前i个数能得到的最大乘积。递推公式如下:
f[i]=Max(f[i-1],b[i]);b[i]表示含有nums[i]的最大乘积。
为求b[i],构造一个额外数组temp,temp[i]=nums[i]*nums[i-1]….*nums[j]; j=0或者nums[j-1]=0, nums[i]=0时,temp[i]=0;
用first记录第一次出现负数的位置(如果有0出现,first要重置)。
不难得出:
if temp[i]>=0||i==first , b[i] = temp[i];
else , b[i]=temp[i]/temp[first].
贴代码:

public int maxProduct(int[] nums) {        int[] temp = new int[nums.length];        int re = nums[0];        temp[0]=re;        int first = -1;        if(re<0)            first=0;        for(int i=1;i<nums.length;i++){            if(temp[i-1]!=0)                temp[i]=temp[i-1]*nums[i];            else{                temp[i]=nums[i];                first=-1;            }            if(temp[i]>re)                re=temp[i];            else if(first!=-1){                if(temp[i]/temp[first]>re)                    re = temp[i]/temp[first];            }            if(nums[i]<0&&first==-1){                first=i;            }        }        return re;    }
原创粉丝点击