[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积

Posted coding-gaga

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积相关的知识,希望对你有一定的参考价值。

问题描述

给定数组,输出所有子数组的累积的最大值。

题解

  • 以arr[i]结尾的最大累乘积=max{maxarr[i],minarr[i],arr[i]},其中max、mini表示以arr[i-1]结尾的最大累乘积、最小累乘积。
  • 最后再取一个最大值即可。
  • 时间复杂度O(n)

代码

public class Main {
    public static void main(String args[]) {
        int[] arr= {-2,4,0,3,5,8,-1};
        int maxProduct=getMaxProduct(arr);
        System.out.println(maxProduct);
    }
    
    public static int getMaxProduct(int[] arr) {
        int max=arr[0];
        int min=arr[0];
        int maxProduct=arr[0];
        for(int i=1;i<arr.length;++i) {
            max=getMax(max*arr[i],min*arr[i],arr[i]);
            min=getMin(max*arr[i],min*arr[i],arr[i]);
            maxProduct=Math.max(max,maxProduct);
        }
        return maxProduct;
    }
    
    public static int getMin(int... vals) {
        int min=Integer.MAX_VALUE;
        for(int val:vals) {
            if(val<min) {
                min=val;
            }
        }
        return min;
    }
    
    public static int getMax(int... vals) {
        int max=Integer.MIN_VALUE;
        for(int val:vals) {
            if(val>max) {
                max=val;
            }
        }
        return max;
    }
}

以上是关于[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积的主要内容,如果未能解决你的问题,请参考以下文章

《程序员代码面试指南》第八章 数组和矩阵问题 计算数组的小和

《程序员代码面试指南》第八章 数组和矩阵问题 自然数数组的排序

《程序员代码面试指南》第八章 数组和矩阵问题 转圈打印矩阵

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

《程序员代码面试指南》第八章 数组和矩阵问题 最长的可整合子数组的长度

《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数