LintCode -- 乘积最大子序列

本文介绍了如何解决LintCode上的'乘积最大子序列'问题,通过遍历数组并维护最大值和最小值来找到乘积最大的子序列。提供了C++、Java和Python三种语言的解决方案,具有O(n)的时间复杂度和O(1)的空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LintCode -- maximum-product-subarray(乘积最大子序列)


原题链接:http://www.lintcode.com/zh-cn/problem/maximum-product-subarray/


找出一个序列中乘积最大的连续子序列(至少包含一个数)。

样例

比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6


分析:

遍历数组,并记录 i - 1个数的时候的最大值和最小值。针对第 i 个数的正负来选择更新最大值和最小值的方法。

****   时间复杂度 O(n), 空间复杂度 O(1) ****


代码(C++、Java、Python):

class Solution {
public:
    /**
     * @param nums: a vector of integers
     * @return: an integer
     */
    int min(int a, int b){
        if (a < b) return a;
        else return b;
    }
    int max(int a, int b){
        if (a > b) return a;
        else return b;
    }
    int maxProduct(vector<int>& nums) {
        // write your code here
        int n = nums.size();
        if (n == 1) return nums[0];
        int res = nums[0];
        int minlist[2] = {nums[0]};
        int maxlist[2] = {nums[0]};
        for (int i = 1; i < n; i++){
            minlist[i%2] = nums[i];
            maxlist[i%2] = nums[i];
            if (nums[i] > 0){
                maxlist[i%2] = max(maxlist[i%2], maxlist[(i-1)%2]*nums[i]);
                minlist[i%2] = min(minlist[i%2], minlist[(i-1)%2]*nums[i]);
            }
            else {
                maxlist[i%2] = max(maxlist[i%2], minlist[(i-1)%2]*nums[i]);
                minlist[i%2] = min(minlist[i%2], maxlist[(i-1)%2]*nums[i]);
            }
            res = max(res, maxlist[i%2]);
        }
        return res;
    }
};

public class Solution {
    /**
     * @param nums: an array of integers
     * @return: an integer
     */
    public int maxProduct(int[] nums) {
        // write your code here
        int n = nums.length;
        if (n == 1) return nums[0];
        int res = nums[0];
        int [] minlist = new int [2];
        int [] maxlist = new int [2];
        for (int i = 0; i < 2; i++){
            minlist[i] = nums[0];
            maxlist[i] = nums[0];
        }
        for (int i = 1; i < n; i++){
            minlist[i%2] = nums[i];
            maxlist[i%2] = nums[i];
            if (nums[i] > 0){
                maxlist[i%2] = max(maxlist[i%2], maxlist[(i-1)%2]*nums[i]);
                minlist[i%2] = min(minlist[i%2], minlist[(i-1)%2]*nums[i]);
            }
            else {
                maxlist[i%2] = max(maxlist[i%2], minlist[(i-1)%2]*nums[i]);
                minlist[i%2] = min(minlist[i%2], maxlist[(i-1)%2]*nums[i]);
            }
            res = max(res, maxlist[i%2]);
        }
        return res;
    }
    int min(int a, int b){
        if (a < b) return a;
        else return b;
    }
    int max(int a, int b){
        if (a > b) return a;
        else return b;
    }
}

class Solution:
    # @param nums: an integer[]
    # @return: an integer
    def maxProduct(self, nums):
        # write your code here
        n = len(nums)
        if n == 1:
            return nums[0]
        res = nums[0]
        minlist = [nums[0] for i in range(2)]
        maxlist = [nums[0] for i in range(2)]
        for i in range(1, n):
            minlist[i%2] = nums[i]
            maxlist[i%2] = nums[i]
            if nums[i] > 0:
                maxlist[i%2] = max(maxlist[i%2], maxlist[(i-1)%2]*nums[i])
                minlist[i%2] = min(minlist[i%2], minlist[(i-1)%2]*nums[i])
            else:
                maxlist[i%2] = max(minlist[i%2], minlist[(i-1)%2]*nums[i])
                minlist[i%2] = min(minlist[i%2], maxlist[(i-1)%2]*nums[i])
            res = max(res, maxlist[i%2])
        return res

def max(a, b):
    if a > b:
        return a
    else:
        return b

def min(a, b):
    if a < b:
        return a
    else:
        return b



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值