LintCode -- 乘积最大子序列

DCM、PLL以及DLL等概念及详情 介绍DLL、PLL以及DCM的概念,总结其模块构成、工作原理、相互之间的差异与各自优势。 阅读详情

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



【WRF-Urban】使用 CGLC-MODIS-LCZ_100m 数据集运行 WRF 时的城市参数化问题 阅读详情

相关推荐

Ubuntu docker镜像中下载安装 DPABI(DPARSF)

在Ubuntu服务器的docker镜像中用MATLAB运行DPABI(以及使用DPARSF的功能)。

Pandako's Blog 1722

Leetcode——乘积最大的子序列(DP)

152.给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 思路: 1.暴力递归,时间复杂度很高 2.DP,两步曲,首先找到状态的定义DP[i],...

IT荻的博客 1264

CanOpen PDO映射实战:从原理到配置的完整指南

本文详细解析了CanOpen PDO映射的原理与配置流程,从基础通信机制到实战配置步骤,涵盖禁用PDO、清空映射、逐项映射和使能PDO等关键环节。特别针对西门子G120变频器、台达伺服和倍福CX控制器等不同厂商设备,提供了具体的配置技巧和常见问题排查指南,帮助工程师快速掌握多厂商设备间的PDO通信配置。

weixin_30718391的博客 516

乘积最大子序列

题目描述:找出一个序列中乘积最大的连续子序列(至少包含一个数)。 样例:比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。 动态规划问题,用一个数组record记录每次运算的结果。这里面有个问题,就是求前n位的乘积最大子序列的最大乘积时,的确和前n - 1位有关,但是不一定和前n - 1位的乘积最大子序列的乘积有关,他有可能是由乘积最小子序列得到的

guoziqing506的博客 3465

立创星火计划:基于STM32H743VIH6的Maverick_H743_MK1.0高性能开源飞控硬件全解析

本文详细解析了基于STM32H743VIH6核心的Maverick_H743_MK1.0高性能开源飞控硬件设计。重点阐述了采用双IMU冗余设计、高精度气压计、多路独立电源管理以及丰富接口(如CAN总线)的考量,旨在为穿越机、科研无人机等平台提供强大、可靠的飞行控制解决方案。

weixin_28787801的博客 197

使用STC15F104W产生PWM脉冲

最近的小项目中使用到了STC15F104W产生PWM脉冲

yeats1989的专栏 1万+

191. 乘积最大子序列

191.乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数)。 样例 样例 1: 输入:[2,3,-2,4] 输出:6 样例 2: 输入:[-1,2,4,1] 输出:8 注意事项 数组长度不超过20000 乘积最大的子序列的积,小于2147483647 public class Solution { /** * @param nums: An array of integers ...

时代我西的博客 198

Windowns下Git环境配置-命令行方式

文章目录一、配置Git1.1 下载Git并安装1.2 配置本地Git用户名和邮箱1.3 注册GitHub二、生成本地公钥,放到GitHub上-SSH Key2.1 生成本地公钥命令2.2 查看生成的公钥2.3 在GitHub放上公钥并测试连通性三、创建项目实操四、可能出现的问题4.1.push不成功4.2.提示SSL的问题4.3.域名不能解析的问题4.4.如果github连接不上的问题 一、配置Git 1.1 下载Git并安装 Git官网 默认安装,根据需要修改安装路径 1.2 配置本地Git用户名和邮箱

学习工作笔记 1135

152. 乘积最大子序列

乘积最大子序列 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。 本题是字串问题 与前面的子串最大和 类似 核心就是 确定一个数组dp【i】...

Since Gate 250

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2245

n8n AI高效工作流自动化 部署使用教程

摘要: n8n是一款开源可视化工作流自动化工具,结合AI能力可高效解决重复性任务。文章详细介绍了从Docker部署到实战应用的完整流程:1)通过Docker Compose自托管n8n,确保数据可控;2)以AI客服日报机器人为例,演示如何串联工单系统、ChatGPT和邮件通知,实现定时自动化;3)进阶搭建交互式AI助手,利用ToolsAgent节点调用业务API;4)整合向量数据库构建RAG知识库问答。关键建议包括:拆分复杂工作流、严格管理凭据、区分开发与生产环境,并建议从高频刚性需求(如日报生成)切入,逐

专注AI大模型,软件混淆,授权 264

动态规划——LeetCode152乘积最大子序列

给定一个整数数组 nums,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释:子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释:结果不能为 2, 因为 [-2,-1] 不是子数组。 思路: max表示以当前节点为终结节点的最大连续子序列乘积 min表示以当前节点为终...

great978的博客 389

从 AccessControl.authorizationCheck 读懂 ABAP CDS 访问控制:默认策略、取舍边界与一线项目实战

摘要: 本文深入解析ABAP CDS视图中@AccessControl.authorizationCheck注解的核心功能与工程实践。该注解通过DCL角色实现行级数据过滤,提供三类能力:控制访问生效条件、约束语义一致性及管理特权访问。文章详述四种注解取值(#CHECK、#NOT_REQUIRED、#NOT_ALLOWED、#PRIVILEGED_ONLY)的适用场景与默认行为,并结合采购订单案例演示DCL与PFCG授权的落地步骤。同时指出访问控制的边界问题(如JOIN场景可能绕过过滤),并给出视图层级决策矩

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 260

LintCode-乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。 分析:访问到每个点的时候,以该点为子序列的末尾的乘积,要么是该点本身,要么是该点乘以以前一点为末尾的序列,注意乘积负负得正,故需要记录前面的最大最小值。 代码: class Solution { public: /**

wangyuquanliuli的专栏 6425

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LintCode:M-乘积最大子序列

LintCode:链接 找出一个序列中乘积最大的连续子序列(至少包含一个数)。 您在真实的面试中是否遇到过这个题?  Yes 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。 分析 当全部为正数的时候,乘积肯定为最大,但是由于有负数出现,只有偶数情况的负数才能转正 所以前面乘积

iyangdi的博客 337

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

lintcode刷题——乘积最大子序列

原题如下: 乘积最大子序列   描述 笔记  数据  评测 找出一个序列中乘积最大的连续子序列(至少包含一个数)。 您在真实的面试中是否遇到过这个题?  Yes 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。 做题思路如下: 1、考虑

yige321的博客 366

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

lintCode【91】乘积最大子序列

描述: 找出一个序列中乘积最大的连续子序列(至少包含一个数)。 样例 : 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。 思路:因为涉及到正负,所以要保存最小值和最大值两种情况,因为负负得正。最小值的比较包括nums[i]、min*nums[i] 、max*nums[i],最大值与此相同,其实最大值就是正数,最小值是负数,中间值没必要记

sunday0904的博客 584

【最值型】LintCode 191.乘积最大的子序列

LintCode 191.乘积最大的子序列 这也是一道最值型动态规划的典型题目,构建状态转移方程时,使用max和min。 代码: class Solution { public: /** * @param nums: An array of integers * @return: An integer */ int maxProduct(vector<int> &nums) { if (0 == nums.size()) {

享受当下 163

Lintcode 乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。分析:访问到每个点的时候,以该点为子序列的末尾的乘积,要么是该点本身,要么是该点乘以以前一点为末尾的序列,注意乘积负负得正,故需要记录前面的最大最小值。牛人代码:class Solution { public: /** * @p

u013174482的博客 328

乘积最大子序列,lintcode

找出一个序列中乘积最大的连续子序列(至少包含一个数)。 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。解题思路:遍历数组,每次纪录当前位置的乘积最大值和成绩最小值,也就是max(nums[i],max[i-1]*nums[i],min[i-1]*nums[i])和min(nums[i],max[i-1]*nums[i],min[i-1]*nums[i]

zsjmfy的专栏 413

领扣LintCode算法问题答案-191. 乘积最大子序列

领扣LintCode算法问题答案-191. 乘积最大子序列 目录191. 乘积最大子序列描述样例 1:样例 2:题解鸣谢 191. 乘积最大子序列 描述 找出一个序列中乘积最大的连续子序列(至少包含一个数)。 数组长度不超过20000 乘积最大的子序列的积,小于2147483647 样例 1: 输入: [2,3,-2,4] 输出: 6 样例 2: 输入: [-1,2,4,1] 输出: 8 题解 public class Solution { /** * @param n.

二当家的白帽子 468

lintcode 191. 乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。 样例 样例 1: 输入:[2,3,-2,4] 输出:6 样例 2: 输入:[-1,2,4,1] 输出:8 注意事项 乘积最大的子序列的积,小于2147483647 class Solution { public: /** * @param nums: An array of integers * @retur...

sinb妃的博客 187

lintcode--乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。 您在真实的面试中是否遇到过这个题?  Yes 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。 /* 分析:假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况, 1.用Max[i]来表示以a[i]结尾的最大连续子序列的乘

wenyunlei520的博客 303

【两次过】Lintcode 191. 乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。 样例 样例 1: 输入:[2,3,-2,4] 输出:6 样例 2: 输入:[-1,2,4,1] 输出:8 解题思路1: 常规思路两遍遍历,时间复杂度O(n^2) public class Solution { /** * @param nums: An array of integers *...

majichen95的博客 245

lintcode- 乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。 您在真实的面试中是否遇到过这个题? 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6 class Solution { public: int maxProduct(vector& nums) {

我有一个梦想 489

python--lintcode191.乘积最大子序列

描述 找出一个序列中乘积最大的连续子序列(至少包含一个数)。 您在真实的面试中是否遇到过这个题?是 样例 比如, 序列[2,3,-2,4]中乘积最大的子序列为[2,3],其乘积为6。 这一题和上一题不一样,既要记录最大值,也要记录最小值,因为有负数,乘积负负得正。 求前n位的乘积最大子序列的最大乘积时,的确和前n - 1位有关,但是不一定和前n - 1位的乘积最大子序...

wenqiwenqi123的博客 1515
上一篇: LintCode -- 不同的路径 II
下一篇: LintCode -- 二叉树的前序遍历
funggor
博客等级 码龄11年 95粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值