每日一题——乘积最大子数组

乘积最大子数组问题详解

    • 问题描述
      • 示例
      • 约束条件
    • 问题分析
      • 难点分析
      • 解题思路
    • 代码实现
      • 代码说明
    • 测试用例
      • 测试用例 1
      • 测试用例 2
      • 测试用例 3
    • 总结

问题描述

给定一个整数数组 nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位整数

示例

示例 1:

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

示例 2:

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

约束条件

  • 1 <= nums.length <= 2 * 10^4
  • -10 <= nums[i] <= 10
  • nums 的任何子数组的乘积都保证是一个 32-位整数

问题分析

本题要求找到一个子数组,使得其乘积最大。由于数组中可能包含负数和零,直接使用暴力解法(枚举所有子数组)的时间复杂度较高,不适用于大规模数据。因此,我们需要寻找更高效的解决方案。

难点分析

  1. 负数的影响:负数乘以负数会变成正数,因此最小乘积的子数组可能在某个时刻变成最大乘积的子数组。
  2. 零的影响:零会将乘积重置为零,因此需要特别处理零的情况。
  3. 动态规划的应用:如何利用已知的子数组乘积信息来推导后续子数组的最大乘积。

解题思路

我们采用动态规划的方法来解决这个问题。具体思路如下:

  1. 定义状态

    • dpMax[i]:表示以第 i 个数字结尾的子数组的最大乘积。
    • dpMin[i]:表示以第 i 个数字结尾的子数组的最小乘积。
  2. 状态转移方程

    • dpMax[i] = max(nums[i], dpMax[i-1] * nums[i], dpMin[i-1] * nums[i])
    • dpMin[i] = min(nums[i], dpMax[i-1] * nums[i], dpMin[i-1] * nums[i])

    由于负数的存在,最小乘积的子数组可能在某个时刻变成最大乘积的子数组,因此需要同时维护最大值和最小值。

  3. 初始化

    • dpMax[0] = nums[0]
    • dpMin[0] = nums[0]
  4. 结果

    • 遍历整个数组,更新全局最大乘积 result

代码实现

以下是完整的C语言代码实现:

#include <stdio.h>
#include <stdlib.h>// 返回三个数中的最大值
int threeMax(int a, int b, int c) {return (a > b ? (a > c ? a : c) : (b > c ? b : c));
}// 返回三个数中的最小值
int threeMin(int a, int b, int c) {return (a < b ? (a < c ? a : c) : (b < c ? b : c));
}// 求解乘积最大子数组
int maxProduct(int* nums, int numsSize) {if (numsSize == 0) {return 0;  // 空数组的情况}// 动态分配内存int* dpMax = (int*)malloc(sizeof(int) * numsSize);int* dpMin = (int*)malloc(sizeof(int) * numsSize);// 初始化第一个元素dpMax[0] = nums[0];dpMin[0] = nums[0];int result = nums[0];  // 用于存储全局最大乘积// 遍历数组,更新 dpMax 和 dpMinfor (int i = 1; i < numsSize; i++) {dpMax[i] = threeMax(nums[i], dpMax[i - 1] * nums[i], dpMin[i - 1] * nums[i]);dpMin[i] = threeMin(nums[i], dpMax[i - 1] * nums[i], dpMin[i - 1] * nums[i]);// 更新全局最大乘积result = (result > dpMax[i]) ? result : dpMax[i];}// 释放动态分配的内存free(dpMax);free(dpMin);return result;
}// 测试函数
int main() {int nums1[] = {2, 3, -2, 4};int nums2[] = {-2, 0, -1};int nums3[] = {-2, 3, -4};printf("Test Case 1: %d\n", maxProduct(nums1, sizeof(nums1) / sizeof(nums1[0])));printf("Test Case 2: %d\n", maxProduct(nums2, sizeof(nums2) / sizeof(nums2[0])));printf("Test Case 3: %d\n", maxProduct(nums3, sizeof(nums3) / sizeof(nums3[0])));return 0;
}

代码说明

  1. threeMaxthreeMin 函数

    • 这两个辅助函数分别用于计算三个数中的最大值和最小值。
  2. 动态规划数组

    • dpMaxdpMin 分别用于存储以当前数字结尾的最大乘积和最小乘积。
  3. 结果更新

    • 在每次更新 dpMax 时,同时更新全局最大乘积 result
  4. 内存管理

    • 动态分配的内存需要在函数结束时释放,避免内存泄漏。

测试用例

以下是几个测试用例及其结果:

测试用例 1

输入:nums = [2, 3, -2, 4]
输出:6
解释:子数组 [2, 3] 的乘积为 6,是最大乘积。

测试用例 2

输入:nums = [-2, 0, -1]
输出:0
解释:子数组 [0] 的乘积为 0,是最大乘积。

测试用例 3

输入:nums = [-2, 3, -4]
输出:24
解释:整个数组的乘积为 24,是最大乘积。


总结

本题通过动态规划的方法,利用 dpMaxdpMin 两个数组分别维护最大乘积和最小乘积,从而解决了负数和零对乘积的影响。这种方法的时间复杂度为 O(n),空间复杂度为 O(n),可以高效地解决大规模数据的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30527.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp,自绘仪表盘组件(基础篇)

文章目录 一、为什么需要自绘仪表盘&#xff1f;二、准备知识三、实现基础仪表盘1. 组件模板结构2. 核心绘制逻辑3. 样式优化 四、使用示例五、核心实现原理六、扩展方向七、常见问题 一、为什么需要自绘仪表盘&#xff1f; 在物联网、数据监控等场景中&#xff0c;仪表盘是常…

导入 Excel 规则批量修改或删除 Excel 表格内容

我们前面介绍过按照规则批量修改 Excel 文档内容的操作&#xff0c;可以对大量的 Excel 文档按照一定的规则进行统一的修改&#xff0c;可以很好的解决我们批量修改 Excel 文档内容的需求。但是某些场景下&#xff0c;我们批量修改 Excel 文档内容的场景比较复杂&#xff0c;比…

Python贝壳网二手小区数据爬取(2025年3月更)

文章目录 一、代码整体架构解析二、各部分代码详解1. main()主函数解析2. 会话初始化&#xff08;伪装浏览器身份&#xff09;3. 动态参数生成&#xff08;反爬虫核心机制&#xff09;4. 列表页抓取&#xff08;获取小区列表&#xff09;5. 列表页解析&#xff08;提取小区信息…

C++的内存管理

1. C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int…

mac本地代理nginx,解决跨域问题

brew install nginxbrew info nginxnginx配置文件 /opt/homebrew/etc/nginx/nginx.conf 如何打开呢&#xff1f; open /opt/homebrew 启动nginx brew services start nginx改配置&#xff1a; server {listen 8080;server_name localhost;#charset koi8-r;#access_…

Clion快捷键、修改字体

文章目录 一、Clion快捷键1.撤销&#xff1a;crtl Z2.重做&#xff1a;crtl shift Z3.删除该行&#xff1a;crtl Y4.多行后退&#xff1a;选中多行 Tab5.多行缩进&#xff1a;选中多行 shift Tab 二、修改注释的斜体 一、Clion快捷键 1.撤销&#xff1a;crtl Z 2.重做…

【漫话机器学习系列】126.多项式回归(Polynomial Regression)

多项式回归&#xff08;Polynomial Regression&#xff09; 1. 什么是多项式回归&#xff1f; 多项式回归&#xff08;Polynomial Regression&#xff09;是一种用于建模非线性关系的回归分析技术。它是线性回归的一种扩展形式&#xff0c;允许模型通过增加自变量的高次项来更…

python网络爬虫开发实战之基本库使用

目录 第二章 基本库的使用 2.1 urllib的使用 1 发送请求 2 处理异常 3 解析链接 4 分析Robots协议 2.2 requests的使用 1 准备工作 2 实例引入 3 GET请求 4 POST请求 5 响应 6 高级用法 2.3 正则表达式 1 实例引入 2 match 3 search 4 findall 5 sub 6 com…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

1、在 vscode 终端执行 get-ExecutionPolicy 返回 Restricted 状态是禁止的 返回 RemoteSigned 状态是可正常执行npm命令 2、更改状态 set-ExecutionPolicy RemoteSigned 如果提示需要管理员权限&#xff0c;可加参数运行 Set-ExecutionPolicy -Scope CurrentUser RemoteSi…

数据结构基础之《(19)—矩阵处理》

一、zigzag打印矩阵 Z字形打印矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 打印顺序&#xff1a;1,2,7,13,8,3,4,9,14... 核心技巧&#xff1a;找到coding上的宏观调度 左上角有A、B两个点&#xff0c;A往右一步一步走&#xff0c;B往下一步一步走 写一个…

OpenCV计算摄影学(17)两个图像之间执行无缝克隆操作函数 seamlessClone()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 图像编辑任务涉及全局更改&#xff08;如颜色/强度校正、滤镜应用、变形&#xff09;或针对选定区域的局部更改。在这里&#xff0c;我们关注的是…

基于Asp.net的零食购物商城网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

MuBlE:为机器人操作任务规划提供了逼真的视觉观察和精确的物理建模

2025-03-05&#xff0c;由华为诺亚方舟实验室、捷克技术大学和帝国理工学院联合开发的MuBlE&#xff08;MuJoCo and Blender simulation Environment&#xff09;模拟环境和基准测试。通过结合MuJoCo物理引擎和Blender高质量渲染&#xff0c;为机器人操作任务规划提供了逼真的视…

文件上传漏洞(upload靶场)

目录 Pass-01&#xff1a;前端绕过 方法一&#xff1a;浏览器禁用js 方法二:直接修改或删除js脚本 方法三&#xff1a;修改后缀绕过 Pass-02:服务器检测 Pess-03:黑名单绕过 Pass-04:.htaccess文件 Pass-05:windows特性和user.ini 方法一&#xff1a;php.自动解析为ph…

blender学习25.3.8

【04-进阶篇】Blender材质及灯光Cycle渲染&后期_哔哩哔哩_bilibili 注意的问题 这一节有一个大重点就是你得打开显卡的渲染&#xff0c;否则cpu直接跑满然后渲染的还十分慢 在这里你要打开GPU计算&#xff0c;但是这还不够 左上角编辑&#xff0c;偏好设置&#xff0c;系…

什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解

美颜SDK是一种用于处理图像与视频的开发工具&#xff0c;能够提供磨皮、美白、瘦脸、五官优化、动态贴纸等美颜特效。它广泛应用于直播、短视频、社交、在线会议、电商等行业&#xff0c;帮助用户在视频或图片中实现更好的视觉呈现。 一、从几何变换到深度学习&#xff1a;美颜…

【江协科技STM32】ADC数模转换器-学习笔记

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁&#xff0c;ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…

Docker 安装 Nacos 2.1.1(单机版)

一、拉取镜像 docker pull nacos/nacos-server:v2.1.1 二、新建数据库 官网上下载 对应版本的 nacos zip 包&#xff0c;在 nacos\conf 目录下有 mysql脚本&#xff1a; 新建一个数据库 nacos_config&#xff0c;在数据库中依次执行 nacos-mysql.sql、1.4.0-ipv6_support-up…

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术&#xff0c;多个主机形成…

国产化替换案例:CACTER邮件网关为Groupwise系统加固邮件安全防线

电子邮件作为企业信息流转的命脉&#xff0c;承载着商业机密与客户数据。然而&#xff0c;网络攻击手段日益复杂&#xff0c;钓鱼邮件等威胁正快速侵蚀企业安全防线。据《2024年第四季度企业邮箱安全性研究报告》显示&#xff0c;2024年Q4企业邮箱用户遭遇的钓鱼邮件数量激增至…