leetcode1856. 子数组最小乘积的最大值(单调栈-java)

news2025/2/21 23:57:41

子数组最小乘积的最大值

  • leetcode1856.子数组最小乘积的最大值
    • 题目描述
    • 解题思路
      • 代码演示:
  • 经典算法集锦

leetcode1856.子数组最小乘积的最大值

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-subarray-min-product

题目描述

一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 。
比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) = 2 * 10 = 20 。
给你一个正整数数组 nums ,请你返回 nums 任意 非空子数组 的最小乘积 的 最大值 。由于答案可能很大,请你返回答案对 109 + 7 取余 的结果。
请注意,最小乘积的最大值考虑的是取余操作 之前 的结果。题目保证最小乘积的最大值在 不取余 的情况下可以用 64 位有符号整数 保存。
子数组 定义为一个数组的 连续 部分。

示例 1:
输入:nums = [1,2,3,2]
输出:14
解释:最小乘积的最大值由子数组 [2,3,2] (最小值是 2)得到。
2 * (2+3+2) = 2 * 7 = 14 。

示例 2:
输入:nums = [2,3,3,1,2]
输出:18
解释:最小乘积的最大值由子数组 [3,3] (最小值是 3)得到。
3 * (3+3) = 3 * 6 = 18 。

示例 3:

输入:nums = [3,1,5,6,4,2]
输出:60
解释:最小乘积的最大值由子数组 [5,6,4] (最小值是 4)得到。
4 * (5+6+4) = 4 * 15 = 60 。

提示:
1 <= nums.length <= 100000
1 <= nums[i] <= 10000000

解题思路

这题我们用单调栈的结构去解答,并单调栈还不熟悉的可以先看下单调栈的实现
计算的过程就是不断以每个元素为最小值的情况下,他所在数组的长度能有多长,因为正数集合的数组,数组越长值越大,最小值固定了,我们就找到最长的子数组就行了。
在单调栈中 我们能找到左侧比他小的数字的下标,这样就能确定左右的边界,就能求出累加和乘以当前数字的大小,不断去比较,求出最大值就可以了:
以示例3,为例。nums = [3,1,5,6,4,2]
我们用图演示下流程:
在这里插入图片描述
因为要不断去计算区域累加和,所以就用辅助累加和数组来优化计算:

代码演示:

/**
     * 最大值
     * @param arr
     * @return
     */
    public static int maxSumMinProduct(int[] arr){
        int size = arr.length;
        long[]sums = new long[size];
        sums[0] = arr[0];
        //生成累加和数组
        for (int i = 1; i < size;i++){
            sums[i] = sums[i - 1] + arr[i];
        }
        //记录最大值
        long max = Long.MIN_VALUE;
        //用数组来优化栈结构,来节省常数时间的复杂度
        int[] stack = new int[size];
        //记录stack的实际大小
        int stackSize = 0;
        for (int i = 0; i < size;i++){
            //如果当前队列不为空,且队列中的值大于i位置的值了,说明到了右边界了,已经不是区域最小值了,我们先求出这个值
           while (stackSize != 0 && arr[stack[stackSize - 1]] >= arr[i]){
               //计算以J为最小值的情况,
               int j = stack[--stackSize];
               long ans = (stackSize == 0 ? sums[i - 1] : (sums[i - 1] - sums[stack[stackSize - 1]])) * arr[j];
               max = Math.max(max,ans);
           }
           //加入到队列中
            stack[stackSize++] = i;
        }

        //计算最后剩余在队列中的
        while (stackSize != 0){
            int j = stack[--stackSize];
            max = Math.max(max,
                    (stackSize == 0 ? sums[size - 1] : (sums[size - 1] - sums[stack[stackSize - 1]])) * arr[j]);
        }
        return (int) (max % 1000000007);
    }

经典算法集锦

单调栈的实现-单调递减栈和单调递增栈

leetcode902. 最大为 N 的数字组合

leetcode526. 优美的排列

leetcode667. 优美的排列 II

leetcode957. N 天后的牢房

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络安全】初探SQL注入漏洞

如何利用SQL注入漏洞获取用户密码 前言1. 设计思路2. 设计目的 一、网站快速搭建1. 登录页2. 注册页3. 数据库连接页4. 首页&#xff08;登录后跳转到此处&#xff09;5. session页6. 注销页7. 查询页8. 数据库 二、SQL注入实例&#xff08;小试牛刀&#xff09;1. 猜测漏洞逻辑…

tomcat部署以及优化

目录 1.三个核心组件 2.tomcat服务部署 3.虚拟主机配置 4.tomcat优化 5.部署两台tomcat服务器 6.总结 1.三个核心组件 web容器 完成web服务 servlet容器 名为catalina 用于处理servlet JSP容器 将JSP动态网页翻译成…

网络通信之旅:揭秘交换机、路由器与网关的神奇世界!

文章目录 一 交换机2.1 交换机初识2.2 MAC地址表2.3 数据包2.4 交换机与数据包2.5 泛洪2.6 结论&#xff1a;交换机—二层设备 三 路由器3.1 WAN口&LAN口3.2 路由器-WAN交换机 四 网关4.1 子网划分4.2 网关4.3 路由 五 实践&#xff1a;路由器桥接-搭建主副路由器5.1 知识探…

动态规划:

这类问题非常简单&#xff0c;甚至看起来有点笨&#xff0c;说白了就是利用计算机的计算能力一步步算过去&#xff0c;也就是大多数人没有意识到的递推问题 比如求1~n的前缀和&#xff1a; #include<iostream> using namespace std; long long sum[100]; int main(){in…

20kV高精度可调高压稳压测试电源的学习与使用

一&#xff1a;应用范围 A: 二极管反向耐压测试 B: 二极管反向漏电流测试 C: 高压电容耐压测试 D: 玻璃釉电阻非线性性能测试 E:氙灯击穿电压测试 F: 材料耐压测试 二、特点 高精度恒流恒压高压输出源 它拥有0~20kV的电压输出能力, 0.005%的电压分辨率精度, 0.1uA的电 …

Docker安装Prometheus和Grafana监控Redis

Docker安装Prometheus和Grafana监控Redis 使用 Docker 安装 Grafana 和 Prometheus 无疑是最简单的&#xff0c;我们接下来将采用此种方式。 1、安装Prometheus 查看Prometheus镜像 $ docker search prometheus拉取镜像 $ docker search bitnami/prometheus在/home/zhangs…

css 小程序 按钮控件点击区域放大 热点区域

背景&#xff1a; 小程序在手机上屏幕过小&#xff0c;但是又想放很多元素&#xff0c;这时候点击区域&#xff0c;命中元素概率很&#xff0c;希望能在不布局不变形情况下&#xff0c;把点击区域放大。 先看效果&#xff1a; 解决方法&#xff1a; 通过&#xff1a;transfo…

WebGL交错缓冲区【Interleaved Buffer】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 昨天我在 WebGL 沙箱项目的评论中收到 Jon 的一个问题&#xff1a; 嗨, 布兰登&#xff0c;以你的演示为起点&#xff0c;我尝试显示一个金字塔&#xff0c;但到目前为止我只能看到它的四个面之一。 如果我使用 gl.LINES…

零信任:基于Apisix构建认证网关

背景 零信任一直是我们未来主攻的一个方向&#xff0c;全球加速&#xff0c;SD-WAN组网都是一些非常成熟的产品&#xff0c;全球加速是我们所有产品的底座&#xff0c;SD-WAN解决的是多个网络打通的问题&#xff0c;而零信任则主打应用访问。 关于零信任&#xff0c;我们已经…

使用Wireshark 找出 TCP 吞吐瓶颈

Debug 网络质量的时候&#xff0c;我们一般会关注两个因素&#xff1a;延迟和吞吐量&#xff08;带宽&#xff09;。延迟比较好验证&#xff0c;Ping 一下或者 mtr[1] 一下就能看出来。这篇文章分享一个 debug 吞吐量的办法。 看重吞吐量的场景一般是所谓的长肥管道(Long Fat …

包装类~~

就是8种基本数据类型对应的引用类型 2&#xff1a;为什么提供包装类 Java为了实现一切皆对象&#xff0c;对8种基本类型提供了对应的引用类型后面的集合和泛型其实也只能支持包装类型&#xff0c;不支持基本数据类型。 自动装箱&#xff1a;基本类型的数据和变量可以直接赋值…

ResNet:深度学习中的重要里程碑

目录 导言&#xff1a; 1. 应用 2. 结构介绍 3. 代码案例 导言&#xff1a; 深度学习的迅速发展在图像识别、语音处理和自然语言处理等领域取得了巨大的突破。然而&#xff0c;深度神经网络在训练过程中遇到了梯度消失和梯度爆炸等问题&#xff0c;限制了模型的性能和训练…

【springboot整合】RabbitMQ

Spring与消息 概述 消息中间件的主要作用&#xff1a;提高系统异步通信、扩展解耦能力消息服务的两个重要概念&#xff1a;消息代理&#xff08;message broker&#xff09;和目的地&#xff08;destination&#xff09;消息队列的两种形式的目的地&#xff1a;队列&#xff…

CentOS ping命令:name or service not known

1.虚拟机网络连接设置为“NAT模式”&#xff0c;且NAT设置 导航栏“编辑”->“虚拟网络编辑器” ->NAT模式->NAT设置 2.网络配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33注&#xff1a;IPADDR和NAT设置里面的IP最后一位要不同 3.DNS设置 vi /etc/reso…

自然语言处理: 第四章Seq2Seq

自然语言处理: 第四章Seq2Seq 理论基础 开始之前&#xff0c;首先提出一个问题&#xff0c;电脑是怎么识别人类的命令的&#xff0c;首先人们通过输入代码(编码) &#xff0c;带入输入给计算机然后再经过处理(解码)得到最终的命令。所以可以看到这其实是一个编码 解码的过程…

lesson10 Zigbee组播通信原理

目录 Zigbee组播通信原理 实验原理 实验过程 实验设计 发送模块 接收模块 实验现象 组播通信总结 Zigbee组播通信原理 实验原理 1、组播通信&#xff1a;在Zigbee无线网络里&#xff0c;模块可以进行分组来标记。发送的模块如果发送的组号和网络里标记模块的组号相对应…

被偷走的文件

也是一道流量解析题目 既然是文件被盗走&#xff0c;可能跟文件传输协议ftp有关&#xff0c;过滤一下ftp 跟踪流后发现有一个flag.rar文件&#xff0c;是内嵌的吗&#xff1f; 那说明应该也可以利用binwal分出来吧 分离出来的rar文件需要密码&#xff0c;拿去爆破一下&#xff…

03_ES6

ES6(在js中进行操作) 使用var声明变量的弊端 var 声明的变量有预解析&#xff0c;造成逻辑混乱&#xff0c;可以先使⽤&#xff0c;后声明,undefined var 可以重复定义同⼀个变量&#xff0c;第二个会修改变量的值 var ⽤在 for 循环条件中&#xff0c;造成 for 循环的污染的…

【八股】【C++】(三)STL

这里写目录标题 STL定义一、容器概念&#xff08;1&#xff09;vector如何避免扩容导致效率低为什么是1.5或2扩容怎么找某vector或者list的倒数第二个元素vector如何释放空间[] 下标检查 &#xff08;2&#xff09;deque&#xff08;3&#xff09;stack&#xff08;4&#xff0…