Algorithms—152.Maximum Product Subarray

来源:互联网 发布:nginx listen 编辑:程序博客网 时间:2024/06/14 15:34

思路:以0分割,拆成非0数组;每个非0数组中,判断有几个负数,如果是偶数个,直接返回,如果不是,则计算2端的乘积直到第一个非负数,比较大小,截取。

public class Solution {    public int maxProduct(int[] nums) {        List<List<Integer>> totalList=new ArrayList<List<Integer>>();        List<Integer> list=new ArrayList<Integer>();        boolean flag=false;        for (int i = 0; i < nums.length; i++) {if (nums[i]!=0) {list.add(nums[i]);}else {    flag=true;if (list.size()!=0) {totalList.add(list);}list=new ArrayList<Integer>();}}        if (list.size()!=0) {totalList.add(list);}        if (totalList.size()==0) {return 0;}        int ans=Integer.MIN_VALUE;    for (int i = 0; i < totalList.size(); i++) {    int f=max(totalList.get(i));if (f>ans) {ans=f;}}if (flag&&ans<0) {return 0;}    return ans;    }        public int max(List<Integer> list){     if (list.size()==1) {return list.get(0);}    int s=-1;    int e=-1;    int sum=0;    for (int i = 0; i <list.size(); i++) {if (list.get(i)<0) {if (s<0) {s=i;}else {e=i;}sum++;}}    if (e==-1) {e=s;}    int ans=1;    for (int i = 0; i <list.size(); i++) {ans*=list.get(i);}    if (sum%2==0) {return ans;}    int left=1;    for (int i = 0; i <=s; i++) {left*=list.get(i);}    int right=1;    for (int i = list.size()-1; i >=e; i--) {right*=list.get(i);}    return left>right?(ans/left):(ans/right);    }}


耗时:304ms,上游,代码写的比较丑,仅仅表示思路。


0 0
原创粉丝点击