zoukankan      html  css  js  c++  java
  • 代码题(43)— 乘积最大子序列

    1、152. 乘积最大子序列

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。

    示例 1:

    输入: [2,3,-2,4]
    输出: 6
    解释: 子数组 [2,3] 有最大乘积 6。
    

    示例 2:

    输入: [-2,0,-1]
    输出: 0
    解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

      其实这道题最直接的方法就是用DP来做,而且要用两个dp数组,其中f[i]表示子数组[0, i]范围内的最大子数组乘积,g[i]表示子数组[0, 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即可,

    class Solution {
    public:
        int maxProduct(vector<int>& nums) {
            if(nums.empty())
                return 0;
            int n = nums.size();
            vector<int> f(n,0), g(n,0);
            int res = nums[0];
            f[0] = nums[0];
            g[0] = nums[0];
            for(int i=1;i<n;++i)
            {
                f[i] = max(max(f[i - 1] * nums[i], g[i - 1] * nums[i]), nums[i]);
                g[i] = min(min(f[i - 1] * nums[i], g[i - 1] * nums[i]), nums[i]);
                res = max(res, f[i]);
            }
            return res;    
            
        }
    };

    方法二:对代码空间进行优化,只保留到目前为止的最大值和最小值。

    class Solution {
    public:
        int maxProduct(vector<int>& nums) {
            if(nums.empty())
                return 0;
            int res = nums[0];
            int numax = nums[0];
            int numin = nums[0];
            for(int i=1;i<nums.size();++i)
            {
                int tmax = numax, tmin = numin;
                numax = max(max(nums[i], tmax*nums[i]),tmin*nums[i]);
                numin = min(min(nums[i],tmax*nums[i]),tmin*nums[i]);
                res = max(res,numax);
            }
            return res;
            
        }
    };
  • 相关阅读:
    gray-code——找规律
    [LeetCode] Decode Ways 解码方法个数、动态规划
    操作系统之面试常考(转)
    国内90%以上的 iOS 开发者,对 APNs 的认识都是错的
    vim配置为IDE环境(超详细,极力推荐 git)
    curl的使用(from 阮一峰)
    图片鉴黄服务提供商
    转: 【理念篇】关于数据驱动运维的几点认识
    业务调度链的染色数据上报和关联
    ITIL的考核管理体系
  • 原文地址:https://www.cnblogs.com/eilearn/p/9453490.html
Copyright © 2011-2022 走看看