当前位置: 首页 > news >正文

【每日一题】子数组的最小值之和

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:贡献法+单调栈
  • 写在最后

Tag

【贡献法】【单调栈】【数组】【2023-11-27】


题目来源

907. 子数组的最小值之和


题目解读

计算整数数组的连续子数组中最小值的和。


解题思路

本题朴素的解决思想是求出所有的连续子数组,遍历每一个子数组然后将每一个子数组的最小和加和得到结果,但是该方法时间复杂度过高。现在介绍一种时间复杂度较优的方法——贡献法。

方法一:贡献法+单调栈

我们从数组中的每一个元素作为连续子数组中的最小值这一角度考虑,比如在数组 arr = [3, 1, 2, 4] 中,考虑 1 作为子数组中的最小值的情况,有这些子数组满足 1 是子数组中的最小值 :
[ 3 , 1 ] , [ 3 , 1 , 2 ] , [ 3 , 1 , 2 , 4 ] , [ 1 ] , [ 1 , 2 ] , [ 1 , 2 , 4 ] [3, 1], [3, 1, 2], [3, 1, 2, 4], [1], [1, 2], [1, 2, 4] [3,1],[3,1,2],[3,1,2,4],[1],[1,2],[1,2,4]
共计6个。利用乘法原理有:
6 = ( i − a ) ∗ ( b − i ) = 2 ∗ 3 6 = (i - a) * (b - i) = 2 * 3 6=(ia)(bi)=23
其中,a 表示在 arr 数组中 1 左侧比 1 小的第一个元素的下标,默认值为 -1,此时 a = -1
b 表示在 arr 数组中 1 右侧比 1 小的第一个元素的下标,默认值为 n,此时 b = n

以上是 arr 数组中无重复元素的情况,我们只需要找出元素 arr[i] 左侧第一个比它小的元素下标 a、元素 arr[i] 右侧第一个比它小的元素下标 b,利用乘法原理即可得到 arr[i] 作为连续子数组的最小值时的答案,我们遍历数组中的所有元素,计算作为连续子数组的最小值时的答案,将所有答案进行加和得到最终的答案,时间复杂度为 O ( n ) O(n) O(n)

一般的情况,若是 arr 数组中有重复元素出现会怎么样呢?此处参考 贡献法+单调栈+三种实现版本(附题单)Python/Java/C++/Go。

如果 arr 有重复元素,例如 arr=[1, 2, 4, 2, 3, 1],其中第一个 2 和第二个 2 对应的边界都是开区间 (0,5),子数组 [2, 4, 2, 3] 都包含这两个 2,这样在计算答案时就会重复统计同一个子数组,算出错误的结果。

为避免重复统计,可以修改边界的定义,把右边界改为「找小于或等于 arr[i] 的数的下标」,那么:

  • 第一个 2 对应的边界是 (0,3),子数组需要在 (0,3) 范围内且包含下标 1
  • 第二个 2 对应的边界是 (0,5),子数组需要在 (0,5) 范围内且包含下标 3
    这样以第一个 2 为最小值的子数组,就不会「越界」包含第二个 2 了,从而解决了重复统计子数组的问题。

实现代码

#define MOD 1000000007
class Solution {
public:int sumSubarrayMins(vector<int>& arr) {int n = arr.size();vector<int> lLessIdx(n, -1);vector<int> rLessAndEquIdx(n, n);// 用单调栈更新 lLessIdxint i;stack<int> stk;// [3, 1, 2, 4]for(i = 0; i < n; ++i) {while(!stk.empty() && arr[stk.top()] >= arr[i]) {stk.pop();}if (!stk.empty()) lLessIdx[i] = stk.top();stk.push(i);}   // 用单调栈更新 rLessAndEquIdxwhile (!stk.empty()) stk.pop();for(i = n-1; i >= 0; --i) {while(!stk.empty() && arr[stk.top()] > arr[i]) {stk.pop();}if (!stk.empty()) rLessAndEquIdx[i] = stk.top();stk.push(i);}long ans = 0;for(i = 0; i < n; ++i) {int a = lLessIdx[i], b = rLessAndEquIdx[i];ans += (long)((i - a) * (b - i)) % MOD * arr[i] % MOD; // 乘法原理ans %= MOD;}return (int)ans;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 是数组 arr 的长度。

空间复杂度: O ( n ) O(n) O(n)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

相关文章:

【每日一题】子数组的最小值之和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贡献法单调栈 写在最后 Tag 【贡献法】【单调栈】【数组】【2023-11-27】 题目来源 907. 子数组的最小值之和 题目解读 计算整数数组的连续子数组中最小值的和。 解题思路 本题朴素的解决思想是求出所有的连续子数组…...

【docker】docker总结

一、Docker简介 Docker是开源应用容器引擎&#xff0c;轻量级容器技术。基于Go语言&#xff0c;并遵循Apache2.0协议开源Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux系统上&#xff0c;也可以实现虚拟化容…...

[英语学习][3][Word Power Made Easy]的精读与翻译优化

[序言] 这次翻译校验, 难度有点大, 原版中英翻译已出现了严重地偏差. 昨晚11点开始阅读如下段落, 花费了1个小时也没有理解原作者的核心表达, 索性睡觉了. 今早学习完朗文单词之后, 9点半开始继续揣摩. 竟然弄到了中午11点30, 终于明白原作者要表达的意思了. 废话不多说&#x…...

使用UIActivityViewController分享图片,没有preview

以前都是用第三方sdk来分享的&#xff0c;最近使用官方的UIActivityViewController来做分享&#xff0c;结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…...

linux安装终端连接工具Tabby

参考&#xff1a;https://zhuanlan.zhihu.com/p/645787655...

Linux telnet命令详解:通过TCP/IP网络连接与管理远程机器(附实例教程和注意事项)

Linux telnet命令介绍 telnet命令&#xff0c;全称为teletype network&#xff0c;是一个使用telnet网络协议来连接并管理远程机器的命令。它通过TCP/IP网络使用端口23来建立连接&#xff0c;并提供了一种使用命令行界面&#xff08;CLI&#xff09;管理远程系统的方式。虽然t…...

linux 磁盘管理、分区管理常用命令

文章目录 基础命令挂载新硬盘/分区添加内存交换分区swaplvm分区管理模式 基础命令 查看目录文件大小 du -sh /backup du -sh /backup/* du -sh *查看磁盘挂载信息 df -lhT查看某个目录挂载在哪个分区&#xff0c;以及分区的磁盘使用情况 df [目录] #例如&#xff1a;df /ho…...

Milvus入门手册1.0

一、window环境搭建&#xff08;单机&#xff09; 1、docker安装 略 2、milvus安装 参考文档&#xff1a;https://milvus.io/docs/install_standalone-docker.md tips: &#xff08;1&#xff09;compose.yaml下载比较慢&#xff0c;可以在网络上找一份。 &#xff08;2&…...

PCL 计算两点云之间的最小距离

目录 一、 算法原理二、 代码实现三、 结果展示四、 相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、 算法原理 pcl::registration::CorrespondenceEstimation是确定目标和查询点集(或特征)之间对应关…...

基于YOLOv5的视频计数 — 汽车计数实现

在视频中计数对象可能看起来有挑战性&#xff0c;但借助Python和OpenCV的强大功能&#xff0c;变得令人意外地易于实现。在本文中&#xff0c;我们将探讨如何使用YOLO&#xff08;You Only Look Once&#xff09;目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…...

jetson nano 串口通信

目录 1.UART通信介绍 2.电脑端准备工作 2.1 安装串口调试助手 2.2 硬件接线 3.Jetson Nano端准备工作 3.1安装库文件 3.2修改主板上电启动串口权限 4.示例程序-发送及接收 4.1 开启串口调试助手 4.2 导入示例程序 4.3 执行程序 4.4 查看效果 4.4.1 串口调试端 4.4…...

Vue基础入门(三):Vue3的使用

Vue3的使用 一、首页案例修改 修改首页的信息&#xff1a;是在之前介绍的HelloWorld.vue文件中进行内容的修改。 页面展示效果&#xff1a; 此时就看到了我们新添加的文字了&#xff01; 同样的我们开发代码的时候只需要修改了项目中的内容然后保存就会自动刷新的浏览器&…...

基于M估计样本一致性算法的点云平面拟合

平面拟合 1、算法简介2、参考文献3、实现效果4、相关代码 1、算法简介 RANSAC 是在给定模型和距离阈值 T T T的情况下&#xff0c;通过寻找最小代价 C C C来确定内点数据并拟合模型。如式&#xff08;1&#xff09;所示的代价函数&#xff0c;当点到模型的距离 e e e小于阈值 T…...

【VRTK】【VR开发】【Unity】8-可交互对象

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 之前我们只是用了一个简单方块作为可交互对象。其实可交互对象可以有许多细节设置,包括具体抓握物体的哪个点,指定抓握的方向,指定Secondary Acti…...

Huggingface 超详细介绍

Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商&#xff0c;他们本来打算创业做聊天机器人&#xff0c;然后在github上开源了一个Transformers库&#xff0c;虽然聊天机器人业务没搞起来&#xff0c;但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…...

pycharm 怎么切换Anaconda简单粗暴

&#xff08;1&#xff09;创建一个环境 &#xff08;2&#xff09;选择一下自己conda的安装路径中conba.exe (3)选择存在的环境&#xff0c;一般会自动检测到conda创建有哪些环境&#xff0c;导入就行...

笔记二十二、使用路由state进行传递参数

22.1 父组件设置state路由参数 <NavLink toclassify state{{param_C: this.state.name, param_D: this.state.age}} className{this.activeStyle}>classify</NavLink> 父组件 Home/index.jsx import React from "react"; import {NavLink, Outlet} from…...

2023 OI 总结

2023 O I 2023 \space OI 2023 OI ここは总 • 结です ここは总\space• \space结です ここは总 • 结です 我也不知道要写些什么&#xff0c;就随便写了 csp/s第一题10min出ac思路&#xff0c;结果写炸了qwq&#xff0c;被旁边的大哥影响稍微有点大&#xff0c;没调完第一题…...

ESP32-Web-Server编程-HTML 基础

ESP32-Web-Server编程-HTML 基础 概述 HTML(HyperText Markup Language) 是用来描述网页的一种语言。其相关内容存储在前端代码的 .html 文件中。 当浏览器向 web 服务器请求网页时&#xff0c;一个 HTML 文件被发送给浏览器&#xff0c;浏览器解释该文件的内容&#xff0c;…...

【docker】docker安装与优化

目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…...

PDF-Parser-1.0应用探索:助力学术研究,高效解析论文PDF

PDF-Parser-1.0应用探索&#xff1a;助力学术研究&#xff0c;高效解析论文PDF 1. 学术研究中的PDF解析痛点 在学术研究领域&#xff0c;PDF格式的论文和文献是知识传播的主要载体。研究人员每天需要处理大量PDF文档&#xff1a;查阅文献综述、提取实验数据、分析研究方法、引…...

从Jupyter到VSCode:我的Julia数据分析环境搭建踩坑全记录

从Jupyter到VSCode&#xff1a;Julia数据分析环境迁移实战指南 当数据分析项目从简单的探索性阶段进入复杂建模时&#xff0c;许多研究者都会面临工具升级的挑战。作为一名长期使用Jupyter Notebook进行快速原型开发的用户&#xff0c;我最近在一个人口统计预测项目中深刻体会到…...

解锁Qwen3-TTS新玩法:在复古游戏界面中创作你的AI语音作品

解锁Qwen3-TTS新玩法&#xff1a;在复古游戏界面中创作你的AI语音作品 1. 当AI语音遇上复古游戏&#xff1a;一场声音的像素冒险 还记得小时候玩红白机时&#xff0c;那些简单却充满魔力的8-bit音效吗&#xff1f;现在&#xff0c;你可以用同样的怀旧方式创作属于自己的AI语音…...

Auto-GPT-ZH 性能优化技巧:10个方法提升AI代理运行效率

Auto-GPT-ZH 性能优化技巧&#xff1a;10个方法提升AI代理运行效率 【免费下载链接】Auto-GPT-ZH Auto-GPT中文版本及爱好者组织 同步更新原项目 AI领域创业 自媒体组织 用AI工作学习创作变现 项目地址: https://gitcode.com/gh_mirrors/au/Auto-GPT-ZH Auto-GPT-ZH作为…...

Gazebo仿真中实现Velodyne 16线激光雷达与URDF机器人模型的高效集成

1. 为什么要在Gazebo中集成Velodyne激光雷达 在机器人仿真开发中&#xff0c;激光雷达是最常用的传感器之一。Velodyne 16线激光雷达因其性价比高、性能稳定&#xff0c;成为很多开发者的首选。但在Gazebo仿真环境中直接使用它&#xff0c;经常会遇到各种报错和显示问题。 我刚…...

MiniCPM-o-4.5-nvidia-FlagOS本地化部署:Ollama模式与星图GPU方案对比

MiniCPM-o-4.5-nvidia-FlagOS本地化部署&#xff1a;Ollama模式与星图GPU方案对比 最近在折腾MiniCPM-o-4.5-nvidia-FlagOS这个模型&#xff0c;发现不少朋友在部署时有点纠结。有人想在自己笔记本上快速跑起来试试&#xff0c;也有人希望找个稳定、性能好的地方长期用。我花时…...

AcousticSense AI部署指南:基于Gradio的音频流派分析工作站搭建

AcousticSense AI部署指南&#xff1a;基于Gradio的音频流派分析工作站搭建 1. 引言&#xff1a;让AI“看见”音乐&#xff0c;从频谱中解读流派密码 你有没有想过&#xff0c;AI不仅能“听”音乐&#xff0c;还能“看”音乐&#xff1f;AcousticSense AI就是这样一个神奇的工…...

宏与脚本语言,应用程序的应用实例

除了 VBA 和 VBScript&#xff0c;脚本语言与应用程序的深度结合&#xff0c;几乎存在于所有你想象得到的专业软件领域。无论是进行专业绘图、处理音频视频、进行科学计算&#xff0c;还是控制外部设备&#xff0c;软件大多会提供一种自动化的能力&#xff0c;而实现这种能力的…...

CANOE实战:基于SOME/IP的以太网通信仿真与配置详解

1. 认识SOME/IP与CANoe的基础组合 第一次接触汽车以太网通信时&#xff0c;我被SOME/IP这个协议名称吸引了注意力。它全称是Scalable service-Oriented MiddlewarE over IP&#xff0c;简单理解就是跑在以太网上的"服务型"通信协议。和传统CAN总线最大的不同在于&…...

IndexTTS2 V23实战体验:上传音频秒变同款语气,效果惊艳

IndexTTS2 V23实战体验&#xff1a;上传音频秒变同款语气&#xff0c;效果惊艳 最近在语音合成圈子里&#xff0c;IndexTTS2的V23版本成了热门话题。大家都在讨论它那个“上传音频秒变同款语气”的功能到底有多神奇。作为一个对AI语音技术保持关注的技术爱好者&#xff0c;我第…...