当前位置: 首页 > 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端配置文件…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​&#xff0c;但它们在功能、语法和性能上有显著区别。以下是它们的详细对比&#xff1a; ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...

【Linux】使用1Panel 面板让服务器定时自动执行任务

服务器就是一台24小时开机的主机&#xff0c;相比自己家中不定时开关机的主机更适合完成定时任务&#xff0c;例如下载资源、备份上传&#xff0c;或者登录某个网站执行一些操作&#xff0c;只需要编写 脚本&#xff0c;然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...