侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

最大连续子序列积

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 85 阅读 / 860 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
输入 int[]

自己想出来的解法
所有数相乘,如果正数直接返回,如果负数就再除以最小负边界序列。但是少考虑了0的情况,导致后来加入了递归使代码臃肿不堪。
class Solution {
    public int maxProduct(int[] nums) {
				//如果有0就分成没0的数组递归判断。
        for(int i = 0;i<nums.length;i++){
            if(nums[i]==0){
                if(nums.length==1)
                    return 0;
                int[] l = new int[i];
                int[] r = new int[nums.length-i-1];
                for(int j=0;j<i;j++)
                    l[j]=nums[j];
                int jj=0;
                for(int j = i+1;j<nums.length;j++){
                    r[jj]=nums[j];
                     jj++;
                }
                if(i==0)
                    return Math.max(0,maxProduct(r));
                if(i==nums.length-1)
                    return Math.max(0,maxProduct(l));
                int max= Math.max(maxProduct(l),maxProduct(r));
                return Math.max(0,max);
            }
        }
				//代码开始
        int left=-1;
        int right=0;
        int sum=1;
        for(int i = 0;i<nums.length;i++){
            int v=nums[i];
            sum*=v;
            if(v<0){
                if(left==-1)
                    left=i;
                right=Math.max(right,i);
            }
        }
        if(sum<0&&nums.length!=1){
            int ls=1,rs=1;
            for(int i = 0; i<=left;i++)
                ls*=nums[i];
            for(int i = right; i<nums.length;i++)
                rs*=nums[i];
            ls=Math.max(ls,rs);
            return sum/ls;
        }else
            return sum;
    }
}
0

评论区