leetcode 152. 乘积最大子数组「贪心」「动态规划」
152. 乘积最大子数组
题目描述:
给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积
思路1:贪心
由于 n u m s [ i ] nums[i] nums[i]都是整数,所以多乘一些数肯定不会让绝对值变小,所以我们就要尽可能多乘一些数
首先,我们考虑最简单的例子,也就是不包含0的情况:
- 统计负数的数量,如果是偶数,那直接返回所有数的乘积即可
- 如果负数的数量是奇数,我们就考虑删掉一个负数,由于我们上面说过,多乘一些数不会让乘积的绝对值变小,所以我们要尽可能少删数,从左往右找到第一个,下标为id1,从右往左找到第一个,下标为id2,要么是删id1往左的所有数,要么是删id2往右的所有数,两种情况取最大值就行
- 你可能会怀疑,为什么答案不可能是被删除的那一段,因为被删除的那一段都在另一半计算过了,删id1往左的所有数时,这段在计算删id2往右的所有数时,被计算过了
class Solution {
public:int fuck(int l, int r, vector<int>nums){if(l > r || l < 0 || r >= nums.size())return -2e9;if(l == r)return nums[l];int mul = 1;for(int i = l; i <= r; ++i)mul *= (nums[i] > 0 ? 1 : -1);if(mul > 0){for(int i = l; i <= r; ++i)mul *= nums[i];return mul;}mul = -1;int id1 = -1, id2 = -1;for(int i = l; i <= r; ++i){mul *= (nums[i] > 0 ? 1 : -1);if(mul > 0){id1 = i;break;}}int ans1 = 1, ans2 = 1;for(int i = id1 + 1; i <= r; ++i){ans1 *= nums[i];}mul = -1;for(int i = r; i >= l; --i){mul *= (nums[i] > 0 ? 1 : -1);if(mul > 0){id2 = i;break;}}for(int i = id2 - 1; i >= l; --i){ans2 *= nums[i];}return max(ans1, ans2);}int maxProduct(vector<int>& nums) {vector<int>v;for(int i = 0; i < nums.size(); ++i){if(nums[i] == 0)v.push_back(i);}if(v.empty())return fuck(0, nums.size() - 1, nums);int ans = 0;v.push_back(nums.size());int pre = -1;for(int i = 0; i < v.size(); ++i){ans = max(ans, fuck(pre + 1, v[i] - 1, nums));pre = v[i];}return ans;}
};
思路2:DP
这题和最大子数组和的题型有一点像,但是不可以像它那样去进行转移,不能仅仅维护一个最大值,这样会忽略偶数个负数乘起来也是正数的情况,有一种局部贪心的感觉
所以还需要维护一个最小值
-
状态:
- m a x n [ i ] maxn[i] maxn[i]表示以 n u m s [ i ] nums[i] nums[i]结尾的子数组乘积的最大值
- m i n x [ i ] minx[i] minx[i]表示以 n u m s [ i ] nums[i] nums[i]结尾的子数组乘积的最小值
-
转移方程:
-
n u m [ i ] > 0 num[i] > 0 num[i]>0
- m a x n [ i ] = m a x ( n u m s [ i ] , m a x n [ i − 1 ] ∗ n u m s [ i ] ) ; maxn[i] = max(nums[i], maxn[i - 1] * nums[i]); maxn[i]=max(nums[i],maxn[i−1]∗nums[i]);
- m i n x [ i ] = m i n ( m i n x [ i − 1 ] ∗ n u m s [ i ] , n u m s [ i ] ) ; minx[i] = min(minx[i - 1] * nums[i], nums[i]); minx[i]=min(minx[i−1]∗nums[i],nums[i]);
-
n u m [ i ] < 0 num[i] < 0 num[i]<0
- m a x n [ i ] = m a x ( m i n x [ i − 1 ] ∗ n u m s [ i ] , n u m s [ i ] ) ; maxn[i] = max(minx[i - 1] * nums[i], nums[i]); maxn[i]=max(minx[i−1]∗nums[i],nums[i]);
- m i n x [ i ] = m i n ( m a x n [ i − 1 ] ∗ n u m s [ i ] , n u m s [ i ] ) ; minx[i] = min(maxn[i - 1] * nums[i], nums[i]); minx[i]=min(maxn[i−1]∗nums[i],nums[i]);
-
为了解决数据加强的问题,可以用double卡过去
class Solution {
public:int maxProduct(vector<int>& nums) {int n = nums.size();vector<double>maxn(n), minx(n);double ans = nums[0];maxn[0] = minx[0] = nums[0];for(int i = 1; i < n; ++i){if(nums[i] > 0){maxn[i] = max((double)nums[i], maxn[i - 1] * nums[i]);minx[i] = min(minx[i - 1] * nums[i], (double)nums[i]);}else if(nums[i] < 0){maxn[i] = max(minx[i - 1] * nums[i], (double)nums[i]);minx[i] = min(maxn[i - 1] * nums[i], (double)nums[i]);}ans = max(ans, maxn[i]);}return (int)ans;}
};
相关文章:

leetcode 152. 乘积最大子数组「贪心」「动态规划」
152. 乘积最大子数组 题目描述: 给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组,并返回该子数组所对应的乘积 思路1:贪心 由于 n u m s [ i ] nums[i] nums[i]都是整数,所以多乘一些数肯定不会让绝…...

Android项目目录结构
Android项目目录结构 1. 顶层目录2. 重要的顶层文件和目录3. app模块目录结构4. 重要的**app**模块文件和目录5. 典型的 **build.gradle** 文件内容 典型的Android项目结构的详细介绍。 1. 顶层目录 MyAndroidApp/ ├── .gradle/ ├── .idea/ ├── app/ ├── build/ ├…...

网络安全--计算机网络安全概述
文章目录 网络信息系统安全的目标网络安全的分支举例P2DR模型信息安全模型访问控制的分类多级安全模型 网络信息系统安全的目标 保密性 保证用户信息的保密性,对于非公开的信息,用户无法访问并且无法进行非授权访问,举例子就是:防…...

用requirements.txt配置环境
1. 在anaconda创建环境 创建Python版本为3.8的环境,与yolov5所需的包适配。 2. 在Anaconda Prompt中激活环境 (base) C:\Users\吴伊晴>conda activate yolov5 3. 配置环境 用指定路径中的requirements.txt配置环境。 (yolov5) C:\Users\吴伊晴>pip insta…...

APP渗透-android12夜神模拟器+Burpsuite实现
一、夜神模拟器下载地址:https://www.yeshen.com/ 二、使用openssl转换证书格式 1、首先导出bp证书 2、将cacert.der证书在kali中转换 使用openssl生成pem格式证书,并授予最高权限 openssl x509 -inform der -in cacert.der -out cacert.pem chmod 777 cacert…...

源码扭蛋机开发初探
在软件开发的世界里,创新总是层出不穷。今天,我们将一起探讨一个有趣而富有创意的项目——源码扭蛋机。源码扭蛋机,顾名思义,就是将传统的扭蛋机概念与代码编程相结合,让开发者们在扭动的过程中随机获得各种有趣的、实…...

Patch SCN使用说明---惜分飞
软件说明 该软件是惜分飞(https://www.xifenfei.com)开发,仅用来查看和修改Oracle数据库SCN(System Change Number),主要使用在数据库因为某种原因导致无法正常启动的情况下使用该工具进行解决.特别是Oracle新版本中使用隐含参数,event,orad…...

【微服务架构的守护神】Eureka与服务熔断深度解析
标题:【微服务架构的守护神】Eureka与服务熔断深度解析 在微服务架构中,服务的数量众多,网络请求的复杂性也随之增加,这使得系统的稳定性面临挑战。服务熔断作为一种保护机制,能够在服务出现问题时及时切断请求&#…...

使用label-studio对OCR数据进行预标注
导读 label-studio作为一款数据标注工具相信大家都不陌生,对于需要进行web数据标注协同来说应该是必备工具了,标注的数据类型很全涉及AI的各个任务(图像、语音、NLP、视频等),还支持自定义涉及模版。 然而,我们在标注数据的过程…...

嵌入式linux sqlite3读写demo
以下是一个简单的C语言程序,使用SQLite数据库进行读写操作的示例。请确保您已经安装了SQLite3库。 #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *NotUsed, int argc, char **argv, char **azColNam…...

vue实现搜索文章关键字,滑到指定位置并且高亮
1、输入搜索条件,点击搜索按钮 2、滑到定位到指定的搜索条件。 <template><div><div class"search_form"><el-inputv-model"searchVal"placeholder"请输入关键字查询"clearablesize"small"style&quo…...

Stable Diffusion与AI艺术:探索人工智能的创造力
引言 随着人工智能(AI)技术的迅猛发展,AI艺术逐渐走进了公众视野。尤其是近年来,Stable Diffusion等技术的出现,显著提升了AI在艺术创作领域的表现力和创造力。这篇文章将深入探讨Stable Diffusion技术的工作原理、应…...

华为HCIP Datacom H12-821 卷26
1.单选题 在VRRP中,同一备份组的设备在进行VRRP报文认证时,以下哪一参数不会影响Master设备和Backup设备认证协商结果 A、认证字 B、优先级 C、认证方式 D、VRRP版本 正确答案: B 解析: 优先级只会影响谁是主谁是备&…...

golang 获取系统的主机 CPU 内存 磁盘等信息
golang 获取系统的主机 CPU 内存 磁盘等信息 要求 需要go1.18或更高版本 官方地址:https://github.com/shirou/gopsutil 使用 #下载包 go get github.com/shirou/gopsutil/v3/cpu go get github.com/shirou/gopsutil/v3/disk go get github.com/shirou/gopsuti…...

Infinitar链游新发展新机遇
区块链游戏市场在近年来经历了显著增长,吸引了大量的投资和关注。随着加密货币和NFT(非同质化代币)概念的普及,越来越多的投资者、游戏开发者和看到了区块链技术在游戏领域的应用潜力,纷纷涌入市场。区块链游戏的用户量…...

Figma 被爆出它剽窃了苹果的设计后撤下了AI工具Make Designs
Figma是一款流行的界面设计工具,最近它推出了一个名为Make Designs的新功能,这个功能利用人工智能帮助用户快速设计应用程序界面。但是,这个工具生成的设计竟然和苹果公司的iOS天气应用非常相似,这让外界怀疑Figma是否剽窃了苹果的…...

ERROR | Web server failed to start. Port 8080 was already in use.
错误提示: *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process thats listening on port 8080 or configure thi…...

C++ 类和对象 构造函数
一 类的6个默认成员函数: 如果一个类中什么成员都没有,简称为空类。 例: #include <iostream> class Empty {// 空类,什么成员都没有 }; 空类中真的什么都没有吗?并不是,任何类在什么都不写时&a…...

纯javascript实现图片批量压缩打包zip下载后端ThinkPHP多国语言切换国际站
最近在做一个多国语言的工具站,需要实现多国语言切换,说到多国语言站,肯定是有2种方式,第一是子域名,第二就是子目录。根据自己的需要来确定。 后台配置如下: 前台显示: 前端纯javascript实现…...

使用ChatGPT写论文,只需四步突破论文写作瓶颈!
欢迎关注,为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流 地表最强大的高级学术AI专业版已经开放,拥有全球领先的GPT学术科研应用,有兴趣的朋友可…...

神领物流项目第一天
文章目录 聚焦快递领域首先第一个是验证码模块流程登录接口权限管家 聚焦快递领域 首先第一个是验证码模块流程 首先生成验证码的流程 可以使用工具类去生成验证码 LineCaptcha lineCaptcha CaptchaUtil.createLineCaptcha(160, 60, 4, 26);// 获取值然后存入redis中 strin…...

[作业]10 枚举-排列类
作业: 已做: #include <iostream> using namespace std; int n; int a[100]; void func(int ,int); int main(){cin>>n;func(0,n);return 0; } void func(int k,int m){if(k>m-1){for(int i0;i<m;i){cout<<a[i];}cout<<en…...

vue2(vue-cli3x[vue.config.js])使用cesium新版(1.117.0)配置过程
看来很多解决方法都没有办法,最后终于。呜呜呜呜 这里我用的是vue-cli去搭建的项目的vue2 项目,其实不建议用vue2搭配cesium。因为目前cesium停止了对vue2的版本更新,现在默认安装都是vue3版本,因此需要控制版本,否则…...

【深度学习】常用命令行指令汇总
这些指令对于管理深度学习环境、监控资源使用、调试程序等方面 查看显卡使用情况 要实时监控NVIDIA显卡的状态,可以使用命令: nvidia-smi -l 1这条命令会每秒刷新一次显卡的使用情况,包括GPU利用率、显存使用情况等。 查看当前Python环境 查看当前使用的Python环境,可…...

谷粒商城学习-11-docker安装redis
文章目录 一,拉取Redis镜像1,搜索Redis的Docker镜像2,拉取Redis镜像3,查看已经拉取的镜像 二,创建、启动Redis容器1,创建redis配置文件2,创建及运行Redis容器3,使用docker ps查看运行…...

C++:类继承是什么,怎么继承
一、类继承是什么 首先了解什么是基类,什么是派生类 在面向对象编程中,基类(Base Class 或 Superclass)是一个类的模板,它定义了一些通用的属性和行为。子类(Derived Class 或 Inheritance)可…...

期权学习必看圣书:《3小时快学期权》要在哪里看?
今天带你了解期权学习必看圣书:《3小时快学期权》要在哪里看?《3小时快学期权》是一本关于股票期权基础知识的书籍。 它旨在通过简明、易懂的语言和实用的案例,让读者在短时间内掌握股票期权的基本概念、操作方法和投资策略。通过这本书&…...

Keepalived 双机热备
1. Keepalived 双机热备 keepalived主要用来提供故障切换(failover)和健康检查(Health Checking)。 1.2 Keepalived 热备方式 Keepalived 采用VRRP (Virtual Router Redundancy Protocol,虚拟路由冗…...

基于React和TypeScript的开源白板项目(Github项目分享)
在学习前端开发的过程中,有时候我们需要一些有趣的项目来提升我们的技能。今天我要给大家介绍的是一个非常酷的项目——NinjaSketch,这是一个用React和TypeScript构建的简易白板工具。这个项目使用了Rough.js来实现手绘风格的效果。尽管这个应用不是响应…...

1019记录
人瑞 - SDK - 外派米哈游 1,接口测试的工具 回答的是postman, 改进:JMeter 2,接口502,什么问题导致的?如何定位? 参考答案:502错误定义:是网关错误, 通俗…...