算法刷题记录 Day52

server/2024/9/20 7:20:09/ 标签: 算法, leetcode, 数据结构

算法刷题记录 Day52

Date: 2024.04.20

lc 84. 柱状图中最大的矩形

// 单调栈
class Solution {
public:int largestRectangleArea(vector<int>& heights) {// 对于每个柱子,我们考虑按当前柱子进行中心扩散,直到找到其左侧及其右侧,高度小于该柱子的柱子为止。// 例如当前柱子高度为2,则所有高度大于等于2的柱子都可以加入该柱子为高的矩形。// 因此,我们需要找到左侧和右侧第一个高度小于指定高度的柱子。(则范围内均为大于等于该高度的柱子)int n = heights.size();vector<int> leftIdx(n, 0);vector<int> rightIdx(n, 0);// 我们借助单调栈获取左右第一个高度小于指定高度的数。// 要获取左侧最近较小值,我们维护一个单调递增的栈。每当一个元素要入栈,我们舍去栈顶的大于该元素的值。// 若栈不为空,则此时的栈顶,即为该元素的左侧第一个更小值。若栈为空,则左侧第一个更小值视作0.stack<int> st;for(int i=0; i<n; i++){int cur_height = heights[i];if(!st.empty() && cur_height > heights[st.top()]){leftIdx[i] = st.top();}else if(!st.empty() && cur_height <= heights[st.top()]){while(!st.empty() && cur_height <= heights[st.top()]){st.pop();}if(st.empty()){leftIdx[i] = -1;}else{leftIdx[i] = st.top();}}else if(st.empty()){leftIdx[i] = -1;}st.push(i);}while(!st.empty()){st.pop();}for(int i=n-1; i>=0; i--){int cur_height = heights[i];if(!st.empty() && cur_height > heights[st.top()]){rightIdx[i] = st.top();}else if(!st.empty() && cur_height <= heights[st.top()]){while(!st.empty() && cur_height <= heights[st.top()]){st.pop();}if(st.empty()){rightIdx[i] = n;}else{rightIdx[i] = st.top();}}else if(st.empty()){rightIdx[i] = n;}st.push(i);}int max_area = -1;for(int i=0; i<n; i++){// cout<<"i:"<<i<<", leftIdx:"<<leftIdx[i]<<", rightIdx:"<<rightIdx[i]<<", (r-l-1):"<<(rightIdx[i] - leftIdx[i] - 2)<<", h:"<<heights[i]<<endl;int cur_area = (rightIdx[i] - leftIdx[i] - 1) * heights[i];max_area = max(max_area, cur_area);}return max_area;}
};// 暴力, ON^2, 超时
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int max_area = INT_MIN;int n = heights.size();// 遍历起点和终点,矩形高为所有点中min,宽为(终点-起点+1);for(int start = 0; start < n; start++){int cur_min = heights[start];for(int end = start; end < n; end++){cur_min = min(cur_min, heights[end]);int cur_area = (end - start + 1) * cur_min;max_area = max(max_area, cur_area);}}return max_area;}
};

http://www.ppmy.cn/server/8741.html

相关文章

【Linux】简单的线程池

目录 线程池介绍 基本概念 定义 组成部分 线程池的优点 资源高效 响应迅速 可管理性 线程池的工作原理 线程池的使用场景 线程池的注意事项 实现简单的线程池 前置函数 Mutex 类介绍 LockGuard 类介绍 Log类的介绍 枚举定义 Log类 全局对象 Conf类 myThre…

SOCKS5代理IP指什麼?

SOCKS5代理IP是一種網路協議&#xff0c;它可以在客戶端和目標伺服器之間建立一個隧道&#xff0c;以進行數據交換&#xff0c;並隱藏用戶的真實IP地址。它是SOCKS協議的最新版本&#xff0c;不僅可以支持TCP和UDP協議&#xff0c;還支持各種類型的網路請求&#xff0c;包括HTT…

Redis key(BigKey、MoreKey)的存储策略

1. MoreKey 案例 1.1 大批量往 redis 里面 插入2000w 测试数据key (1) Linux Bash 下面执行&#xff0c;插入 100w rootspray:~# for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt; done; 查看 rootspray:~# more /tmp/redisTest.…

在Spring Boot中使用POI完成一个excel报表导入数据到MySQL的功能

最近看了自己玩过的很多项目&#xff0c;忽然发现有一个在实际开发中我们经常用到的功能&#xff0c;但是我没有正儿八经的玩过这个功能&#xff0c;那就是在Spring Boot中实现一个excel报表的导入导出功能&#xff0c;这篇博客&#xff0c;主要是围绕excel报表数据导入进行&am…

el-table-column叠加el-popover使用

需求&#xff1a;el-table-column有一列展示多个tag信息&#xff0c;实现点击tag展示tag信息以及tag对应的详细信息 table的数据格式 data:[{...,isPopoverVisible:false,},{...,isPopoverVisible:false,},... ]写法&#xff1a; <el-table-column label"配置信息&q…

Java工程maven中排包exclude的操作

一、背景 在开发项目时依赖了新的jar包&#xff0c;结果工程启动时报错了&#xff0c;此时应该是包依赖冲突的问题。 二、确定冲突的依赖包 执行mvn clean install&#xff0c;通过报错信息来确定冲突的jar包信息 三、排除冲突包的方案 有两种冲突的情况&#xff1a; 1&am…

排序算法。

***冒泡排序: 基本&#xff1a; private static void sort(int[] a){for (int i 0; i < a.length-1; i) {for (int j 0; j < a.length-i-1; j) {if (a[j]>a[j1]){swap(a,j,j1);}}}} private static void swap(int[] a,int i,int j){int tempa[i];a[i]a[j];a[j]temp…

RestClient操作Elasticsearch(Java)

Es官方提供了各种不用语言的客户端&#xff0c;用来操作Es&#xff0c;这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给Es&#xff0c;从而简化操作 es基础篇不熟悉参考一下博客&#xff1a;ElasticSearch入门篇-CSDN博客文章浏览阅读445次&#xff0c;点赞7次…

MathType安装导致的Word粘贴操作出现运行时错误‘53’:文件未找到:MathPage.WLL

MathType安装导致的Word粘贴操作出现运行时错误‘53’&#xff1a;文件未找到&#xff1a;MathPage.WLL 解决方案 1、确定自己电脑的位数&#xff1b; 2、右击MathType桌面图标&#xff0c;点击“打开文件所在位置”&#xff0c;然后找到MathPage.WLL &#xff0c;复制一份进行…

docker初始化进程

docker run --init 是一个 Docker 命令的选项&#xff0c;用于在容器中运行一个初始化进程&#xff08;通常是 tini&#xff09;。这个初始化进程负责处理一些 Unix 信号&#xff08;如 SIGTERM 和 SIGCHLD&#xff09;&#xff0c;并确保容器中的进程能够正确地被管理和清理。…

Java学习笔记29(泛型)

1.泛型 ArrayList<Dog> arrayList new ArrayList<Dog>(); //1.当我们ArrayList<Dog>表示存放到ArrayList集合中的元素是Dog类 //2.如果编译器发现添加的类型&#xff0c;不满足要求&#xff0c;就会报错 //3.在便利的时候&#xff0c;可以直接取出Dog类型而…

深入理解JavaScript - Proxy模拟vue的代理

视频链接 ⚠️视频里使用proxy的代码不能用&#xff01;&#xff01;&#xff01; &#xff08;1&#xff09;简单使用 const obj {a: 1,b: 2,c: {a: 1,b: 2,}, }; let v obj.a; Object.defineProperty(obj, "a", {get() {console.log("读取", a);},se…

08-GPtimer

通用定时器 &#xff08;GPTimer&#xff09; 通用定时器简介 通用定时器可用于准确设定时间间隔、在一定间隔后触发&#xff08;周期或非周期的&#xff09;中断或充当硬件时钟。如下图所示&#xff0c;ESP32-S3 包含两个定时器组&#xff0c;即定时器组 0 和定时器组 1。每…

npm内部机制与核心原理

npm 的核心目标&#xff1a; Bring the best of open source to you, your team and your company. npm 最重要的任务是安装和维护开源库。 npm 安装机制与背后思想 npm 的安装机制非常值得探究。Ruby 的 Gem&#xff0c;Python 的 pip 都是全局安装机制&#xff0c;但是 npm …

Kali Linux如何开启ssh远程连接服务

在Kali Linux中开启SSH服务&#xff0c;可以按照以下步骤进行操作&#xff1a; 切换到管理员用户&#xff1a;在终端中输入su root&#xff0c;然后输入root用户的密码以切换到root用户。这是因为修改SSH服务的配置文件通常需要管理员权限。 安装SSH服务器&#xff1a;如果尚未…

Python零基础从小白打怪升级中~~~~~~~TCP网络编程

TCP网络编程 一、什么是TCP协议 TCP( Transmission control protocol )即传输控制协议&#xff0c;是一种面向连接、可靠的数据传输协议&#xff0c;它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 &#xff1a;数据传输之前客户端和…

骑砍2霸主MOD开发(4)-游戏场景(scene)制作

一.MapScene和MissionScene MapScene:进入游戏首次加载的RTS视角大地图场景对应scene_name为Main_map,引擎固定加载SandBox/SceneObj/Main_map. MissionScene:进入酒馆,野外战斗等第三人称游戏场景 二.游戏场景(scene.xscene) 1.Terrain地形 <1.layers:纹理layer增量 <2…

c#创建安装windows服务

在C#中创建并安装Windows服务&#xff0c;通常需要以下几个步骤&#xff1a; 创建Windows服务项目编写服务逻辑编译服务项目安装服务启动和停止服务 下面是一个简单的步骤指南&#xff1a; 步骤 1: 创建Windows服务项目 在Visual Studio中&#xff0c;创建一个新的Windows服…

JVM虚拟机(十二)ParallelGC、CMS、G1垃圾收集器的 GC 日志解析

目录 一、如何开启 GC 日志&#xff1f;二、GC 日志分析2.1 PSPO 日志分析2.2 ParNewCMS 日志分析2.3 G1 日志分析 三、GC 发生的原因3.1 Allocation Failure&#xff1a;新生代空间不足&#xff0c;触发 Minor GC3.2 Metadata GC Threshold&#xff1a;元数据&#xff08;方法…

K8S调度下的ingress-controller集群的实现以及nginx配置

# 22、K8S调度下的ingress-controller集群的实现以及nginx配置 目标&#xff1a; 1. 实现ingress-controller的集群部署 实现方法&#xff1a; 1. 为ingress-controller 规划两个节点 2.将这两个节点 打上自定义的 label 3.修改yaml文件&#xff0c;并重新创建 ingress-co…