【八十七】【算法分析与设计】单调栈全新版本,右大于,左小于右小于等于,739. 每日温度,907. 子数组的最小值之和

739. 每日温度(右大于)

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

 

输入: temperatures = [73,74,75,71,69,72,76,73] 输出: [1,1,4,2,1,1,0,0]

示例 2:

输入: temperatures = [30,40,50,60] 输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90] 输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 10(5)

  • 30 <= temperatures[i] <= 100

1.

在这个问题中,给定一个数组,代表连续几天的温度,目标是对于每一天,找出需要等待多少天才能有更高的温度。如果没有更高的温度,就返回0。单调栈在这类问题中特别有用,因为它可以帮助我们有效地处理和查询序列中元素的顺序和大小关系。

2.

利用单调栈维护每一个元素右边最近大于元素下标的信息.

arr数组我们用用下标对应元素值.

p_max数组我们用下标对应信息,每一个元素值都有一个信息.记录右边最近大于元素的下标.

3.

用一个循环维护数组p_max的信息,我需要表示右边的最近的信息,那么右边的所有数都需要进入到单调栈里面.所以我们应该从右往左遍历.

每一次都是入栈的时候维护信息.

 
class Solution {
public:vector<int> arr; // 用于存储输入的温度数组vector<int> ret; // 用于存储输出结果数组int n; // 数组长度using p=pair<int,int>; // 定义一个 pair 类型 p,用于存储索引和值对vector<int> p_max; // 用于存储每个元素右边第一个大于它的元素索引vector<int> st; // 辅助栈,用于单调栈实现// 初始化函数void init(){n=arr.size(); // 获取数组长度p_max.assign(n,0); // 初始化 p_max,大小为 n,所有元素初始化为 0ret.assign(n,0); // 初始化 ret,大小为 n,所有元素初始化为 0}// 解决函数void solve(){// 从后往前遍历每个元素,找到每个元素右边第一个比它大的元素for(int i=n-1;i>=0;i--){while(1){if(st.empty())break; // 如果栈为空,跳出循环if(arr[i]<arr[st.back()])break; // 如果当前元素小于栈顶元素,跳出循环st.pop_back(); // 弹出栈顶元素}p_max[i]=st.empty()?0:st.back(); // 记录右边第一个比当前元素大的元素索引st.push_back(i); // 将当前元素索引入栈}// 计算每个元素距离下一个更高温度的天数for(int i=0;i<n;i++){if(p_max[i]!=0)ret[i]=p_max[i]-i; // 如果存在更高温度,计算天数差else ret[i]=0; // 如果不存在更高温度,设置为 0}}// 主函数,处理输入并返回结果vector<int> dailyTemperatures(vector<int>& _temperatures) {ios::sync_with_stdio(false); // 禁用同步,以提高 I/O 性能cin.tie(0); // 解除 cin 和 cout 的绑定cout.tie(0); // 解除 cout 的绑定arr=_temperatures; // 将输入温度数组赋值给 arrinit(); // 调用初始化函数solve(); // 调用解决函数    return ret; // 返回结果数组}
};

907. 子数组的最小值之和(左小于,右小于等于)

给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。

由于答案可能很大,因此 返回答案模 10^9 + 7

示例 1:

输入:arr = [3,1,2,4] 输出:17 解释: 子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。 最小值为 3,1,2,4,1,1,2,1,1,1,和为 17。

示例 2:

输入:arr = [11,81,94,43,3] 输出:444

提示:

  • 1 <= arr.length <= 3 * 10(4)

  • 1 <= arr[i] <= 3 * 10(4)

1.左小于,右小于等于--->完美表示所有的情况.

 
class Solution {
public:using LL=long long; // 定义长整型别名 LLvector<int> arr; // 用于存储输入的数组LL n; // 数组长度using p=pair<int,int>; // 定义一个 pair 类型 p,用于存储索引对vector<p> p_m; // 用于存储每个元素左边和右边第一个小于它的元素索引vector<int> st; // 辅助栈,用于单调栈实现LL MOD=1e9+7; // 定义常量 MOD 为 10^9 + 7LL ret; // 用于存储结果// 初始化函数void init(){n=arr.size(); // 获取数组长度p_m.assign(n,{0,0}); // 初始化 p_m,大小为 n,所有元素初始化为 {0,0}}// 解决函数void solve(){// 遍历每个元素,找到每个元素左边第一个小于它的元素for(int i=0;i<n;i++){while(1){if(st.empty())break; // 如果栈为空,跳出循环if(arr[i]>arr[st.back()])break; // 如果当前元素大于栈顶元素,跳出循环st.pop_back(); // 弹出栈顶元素}p_m[i].first=st.empty()?-1:st.back(); // 记录左边第一个比当前元素小的元素索引st.push_back(i); // 将当前元素索引入栈}st.clear(); // 清空栈// 遍历每个元素,找到每个元素右边第一个小于或等于它的元素for(int i=n-1;i>=0;i--){while(1){if(st.empty())break; // 如果栈为空,跳出循环if(arr[i]>=arr[st.back()])break; // 如果当前元素大于或等于栈顶元素,跳出循环st.pop_back(); // 弹出栈顶元素}p_m[i].second=st.empty()?n:st.back(); // 记录右边第一个小于或等于当前元素的元素索引st.push_back(i); // 将当前元素索引入栈}// 计算所有子数组最小值的总和for(int i=0;i<n;i++){ret=(ret+((i-p_m[i].first)*(p_m[i].second-i)%MOD)*arr[i]%MOD)%MOD; // 计算并累加每个子数组的最小值}}// 主函数,处理输入并返回结果int sumSubarrayMins(vector<int>& _arr) {ios::sync_with_stdio(0); // 禁用同步,以提高 I/O 性能cin.tie(0); // 解除 cin 和 cout 的绑定cout.tie(0); // 解除 cout 的绑定arr=_arr; // 将输入数组赋值给 arrinit(); // 调用初始化函数solve(); // 调用解决函数return ret; // 返回结果}
};

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

微信公众号接入chatGPT自动回复(2)

微信公众平台 配置自动回复的服务器 application.properties中的配置 验证服务器接口配置 其实就两个接口(相同的url地址,只不过请求方式不一样) 1.验证接口(get请求) 2.自动回复接口(post请求) 完整代码 这个地址就是上面URL配置的地址 如果使用Nginx的话自动配置 将该代…

[原创](Modern C++)现代C++的字符串与Windows API交互的正确方式.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

@PostConstruct

PostConstruct initializeBean方法–> PostProcessor.postProcessMergedBeanDefinition --> InitDestroyAnnotationBeanPostProcessor.postProcessBeforeDestruction 被PostConstruct注解的方法会在Bean初始化的时候被调用&#xff0c;如下图&#xff1a; 继承关系如下…

jenkins连接ubuntu普通用户节点

1.创建credentials 2.创建node 3.在jenkins服务器还需要进行的操作&#xff08;jenkins服务器中&#xff09; mkdir /var/lib/jenkins/.ssh ssh-keyscan -H 192.168.110.204 >> /var/lib/jenkins/.ssh/known_hosts chown -R jenkins:jenkins /var/lib/jenkins/.ssh/ 4.…

相交链表(数据结构)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 解决思路 1&#xff0c;找到相交的点 相交链表的关键也就是找到相交的点&#xff0c;所以我们需要首先判断有没有相交的节点&#…

程序员必读书籍推荐

在快速发展的编程领域&#xff0c;不断学习和积累是每位程序员的必修课。以下是几本对于程序员来说&#xff0c;不容错过的必读书籍。 《代码大全》是一本编程界的经典之作&#xff0c;书中不仅详细介绍了编程的最佳实践&#xff0c;还深入探讨了软件构建的艺术。对于想要提升…

最新的云渲染100活动有哪些?渲染100邀请码1a12

随着科技的进步&#xff0c;云渲染已经成为设计行业的必备工具&#xff0c;各个云渲染平台为了吸引用户也推出各种各样的活动&#xff0c;今天我们以广受好评的渲染100为例&#xff0c;来说下它们的活动体系。 1、新用户活动 渲染100对新用户很友好&#xff0c;提供了充足的测…

K-RTD01和利时FW248中控卡件

K-RTD01和利时FW248中控卡件。 系统概述 的全称为保护工程师站及录波分析后台”是利用现代计算机和网络技术&#xff0c;K-RTD01和利时FW248中控卡件。实时收集变电站运行和故障信息&#xff0c;并通过对变电站的故障信息进行综合分析&#xff0c;K-RTD01和利时FW248中控卡件。…

Ps 滤镜:便条纸

Ps菜单&#xff1a;滤镜/滤镜库/素描/便条纸 Filter Gallery/Sketch/Note Paper 便条纸 Note Paper滤镜用于模拟手工纸张的质感和视觉效果。此滤镜将图像简化并添加浮雕和颗粒效果&#xff0c;使图像看起来像是在手工制作的纸上绘制或打印。 “便条纸”滤镜通过结合使用浮雕效果…

【代码】matlab调用COM端口获取传感器数据

参考链接 原始代码 clc clear close all fclose(instrfind)%先关闭所有串口 % scom serial(COM7); %建立串口对象函数&#xff08;需要手动和自己电脑的端口匹配&#xff09; fclose(scom); %关闭串口设备对象 scom.InputBufferSize 512;%输入缓冲区 scom.O…

为什么一个项目在idea中的配置文件设置端口号为8000,在vue中设置端口号为8080,项目可以运行成功?

在学习一个前后端分离开发的项目中&#xff0c;突然发现该项目在idea的配置文件中&#xff0c;设置的端口号为8000 application.properties&#xff1a; server.port8000 而在vue的配置文件中&#xff0c;设置的项目端口号为8080&#xff1a; devServer: {port: 8080,clien…

Copilot for Microsoft 365 扩充新增 16 种语言

最近&#xff0c;微软公司发布公告&#xff0c;进一步扩大 Copilot for Microsoft 365 语言支持&#xff0c;新增 16 种&#xff0c;支持的语言总数达到 25 种。 新支持的语言如下&#xff1a; 阿拉伯语 捷克语 丹麦语 荷兰语 芬兰语 希伯来语 匈牙利语 韩语 挪威语&am…

Sass详解:CSS预处理器的强大之处

Sass详解&#xff1a;CSS预处理器的强大之处 Sass&#xff0c;全称为Syntactically Awesome Style Sheets&#xff0c;是一种CSS预处理器&#xff0c;它扩展了CSS的功能&#xff0c;提供了变量、嵌套规则、混合&#xff08;Mixins&#xff09;、函数等强大的编程特性&#xff…

生活中的网络

加zkhengyang&#xff0c;可申请进数字音频系统研究开发交流答疑群(课题组) 最熟悉的是计算机网络&#xff0c;集线器&#xff0c;交换机&#xff0c;网桥&#xff0c;路由器&#xff0c;电脑主机&#xff0c;同轴电缆&#xff0c;双绞线&#xff0c;光纤等组成。 电视机网络…

网络安全科普:保护你的数字生活

# 网络安全科普&#xff1a;保护你的数字生活 ## 引言 在数字化时代&#xff0c;网络安全已成为每个人都必须面对的问题。从个人隐私保护到金融交易安全&#xff0c;网络的安全性直接关系到我们的日常生活。因此&#xff0c;普及网络安全知识&#xff0c;提高公众的网络安全意…

Elasticsearch 与 OpenSearch:6 个主要区别以及如何选择

什么是 Elasticsearch&#xff1f; Elasticsearch 是一个基于 Apache Lucene 构建的开源 RESTful 分布式搜索和分析引擎。它旨在处理大量数据&#xff0c;使其成为日志和事件数据管理的热门选择。Elasticsearch 还以其实时功能而闻名&#xff0c;允许用户在数据模式发生时对其…

云动态摘要 2024-05-12

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

【解决】Android Studio Toast点击不显示

问题描述 开发Android程序过程中&#xff0c;突然发现在Android studio的模拟机上&#xff0c;运行测试程序&#xff0c;Toast弹框不能使用了&#xff0c;但是解决方法非常粗暴和直接&#xff1a;重新加载一个新的虚拟机或清空当前虚拟机的数据&#xff0c;然后再重启。 明显&a…

mysql临时表

临时表 MySQL 什么时候会使用内部临时表&#xff1f; 1、如果语句执行过程可以一边读数据&#xff0c;一边直接得到结果&#xff0c;是不需要额外内存的&#xff0c;否则就需要额外的内存&#xff0c;来保存中间结果&#xff1b; 2、join_buffer 是无序数组&#xff0c;sort_b…