zoukankan      html  css  js  c++  java
  • 152 Maximum Product Subarray 乘积最大子序列

    找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
    例如, 给定序列 [2,3,-2,4],
    其中乘积最大的子序列为 [2,3] 其乘积为 6。
    详见:https://leetcode.com/problems/maximum-product-subarray/description/

    Java实现:

    方法一:

    用两个dp数组,其中f[i]表示子数组[0, i]范围内并且一定包含nums[i]数字的最大子数组乘积,g[i]表示子数组[0, i]范围内并且一定包含nums[i]数字的最小子数组乘积,初始化时f[0]和g[0]都初始化为nums[0],其余都初始化为0。那么从数组的第二个数字开始遍历,那么此时的最大值和最小值只会在f[i-1]*nums[i]、g[i-1]*nums[i]和nums[i]这三个数字之间产生。所以我们用三者中的最大值来更新f[i],用最小值来更新g[i],然后用f[i]来更新结果res即可,由于最终的结果不一定会包括nums[n-1]这个数字,所以f[n-1]不一定是最终解,不断更新的结果res才是。

    class Solution {
        public int maxProduct(int[] nums) {
            int n=nums.length;
            int res=nums[0];
            int[] f=new int[n];
            int[] g=new int[n];
            f[0]=nums[0];
            g[0]=nums[0];
            for(int i=1;i<n;++i){
                f[i]=Math.max(Math.max(f[i-1]*nums[i],g[i-1]*nums[i]),nums[i]);
                g[i]=Math.min(Math.min(g[i-1]*nums[i],f[i-1]*nums[i]),nums[i]);
                res=Math.max(res,f[i]);
            }
            return res;
        }
    }
    

    方法二:

    class Solution {
        public int maxProduct(int[] nums) {
            int n=nums.length;
            int res=nums[0];
            int mn=nums[0];
            int mx=nums[0];
            for(int i=1;i<n;++i){
                int tmax=mx,tmin=mn;
                mx=Math.max(Math.max(tmax*nums[i],tmin*nums[i]),nums[i]);
                mn=Math.min(Math.min(tmax*nums[i],tmin*nums[i]),nums[i]);
                res=Math.max(res,mx);
            }
            return res;
        }
    }
    

    参考:https://www.cnblogs.com/grandyang/p/4028713.html

  • 相关阅读:
    Hive是什么
    Hive导入数据的四种方法
    grafana安装
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
    linux下mysql安装报错及修改密码登录等等
    chown -R 用户名:组名 ./ 及 chown用法介绍
    Hadoop提交作业流程
    Java中常见的几种异常
    mysql索引需要了解的几个注意
    js数组依据下标删除元素
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8728145.html
Copyright © 2011-2022 走看看