LeetCode 剑指 Offer II 栈 专题总结

int y = stack.top(); stack.pop();

int x = stack.top(); stack.pop();

stack.emplace(x - y);

}else if(tokens[i] == “*”) {

int y = stack.top(); stack.pop();

int x = stack.top(); stack.pop();

stack.emplace(x * y);

}else if(tokens[i] == “/”) {

int y = stack.top(); stack.pop();

int x = stack.top(); stack.pop();

stack.emplace(x / y);

}else {

stack.emplace(stoi(tokens[i]));

}

}

return stack.top();

}

};

037. 小行星碰撞

==========================================================================

题目:

给定一个整数数组 asteroids,表示在同一行的小行星。

对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。

找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

示例:

输入:asteroids = [5,10,-5]

输出:[5,10]

解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。

提示:

  • 2 <= asteroids.length <= 104

  • -1000 <= asteroids[i] <= 1000

  • asteroids[i] != 0

思路:

用动态数组模拟栈

入栈:当栈为空 or 当前数为正数 or 栈中元素为负数

出栈:

  • 栈不为空 and 栈顶正数 and 栈顶小于当前负数的绝对值(第三个条件包含了当前数为负数的条件)
  • 栈不为空 and 当前数为负数 and 栈顶 等于 当前数

class Solution {

public:

vector asteroidCollision(vector& asteroids) {

vector res;

for(int i : asteroids) {

while(!res.empty() && res.back() > 0 && res.back() < -i) {

res.pop_back();

}

if(!res.empty() && i < 0 && res.back() == -i) {

res.pop_back();

} else if(res.empty() || i > 0 || res.back() < 0) {

res.push_back(i);

}

}

return res;

}

};

038. 每日温度

=========================================================================

题目:

请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例:

输入: temperatures = [73,74,75,71,69,72,76,73]

输出: [1,1,4,2,1,1,0,0]

提示:

  • 1 <= temperatures.length <= 105

  • 30 <= temperatures[i] <= 100

思路:

单调栈(递减)

栈中存储数组下标(方便计算天数)

while :如果栈顶小于当前数,相当于遇到高温天气,更新低温天气 res 的值

class Solution {

public:

vector dailyTemperatures(vector& temperatures) {

int n = temperatures.size();

vector res(n);

stack sta;

for(int i = 0; i < n; i++) {

while(!sta.empty() && temperatures[sta.top()] < temperatures[i]) {

res[sta.top()] = i - sta.top();

sta.pop();

}

sta.push(i);

}

return res;

}

};

039. 直方图最大矩形面积(困难)

==================================================================================

题目:

给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例:

在这里插入图片描述

输入:heights = [2,1,5,6,2,3]

输出:10

解释:最大的矩形为图中红色区域,面积为 10

提示:

  • 1 <= heights.length <=105

  • 0 <= heights[i] <= 104

思路:

单调栈(递增)

详细题解:《剑指offer 2 面试题39》 书中算法C++实现

class Solution {

public:

int largestRectangleArea(vector& heights) {

//单调递增的栈,栈里元素存储数组下标

stack sta;

//-1为哨兵,计算宽度时使用

sta.push(-1);

int maxArea = 0;

for(int i = 0; i < heights.size(); i++) {

//遇到小于栈顶元素时,计算栈顶元素的面积

while(sta.top() != -1 && heights[sta.top()] > heights[i]) {

int height = heights[sta.top()]; sta.pop();

int width = i - sta.top() - 1;

maxArea = max(maxArea, height * width);

}

sta.push(i);

}

//当有剩余元素时,即里面都是单调递增元素,将右边添加一个0即可计算面积,0的下标–>heights.size()

while(sta.top() != -1) {

int height = heights[sta.top()]; sta.pop();

//计算的又边界为0的下标 heights.size()

int width = heights.size() - sta.top() - 1;

maxArea = max(maxArea, height * width);

}

return maxArea;

}

};

040. 矩阵中最大的矩形(困难)

=================================================================================

题目:

给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。

注意:此题 matrix 输入格式为一维 01 字符串数组。

示例:

在这里插入图片描述

输入:matrix = [“10100”,“10111”,“11111”,“10010”]

输出:6

解释:最大矩形如上图所示。

提示:

  • rows == matrix.length

  • cols == matrix[0].length

  • 0 <= row, cols <= 200

  • matrix[i][j]'0''1'

思路:

将这题转换成上一题 剑指 Offer II 039. 直方图最大矩形面积(困难) 的扩展

因为最大矩阵一定是以矩阵的某一行为底边的,所以可以遍历各行,将每行的数组带入上题代码得到该行最大矩阵

第一行等效为 [1, 0, 1, 0, 0]

第二行等效为 [2, 0, 2, 1, 1]

第三行等效为 [3, 1, 3, 2, 2]

第四行等效为 [4, 0, 0, 3, 0]

详细题解:《剑指offer 2 面试题40》 书中算法C++实现

class Solution {

public:

int maximalRectangle(vector& matrix) {

if(matrix.size() == 0) return 0;

vector height(matrix[0].size());

int maxArea = 0;

for(int i = 0; i < matrix.size(); i++) {

for(int j = 0; j < matrix[0].size(); j++) {

if(matrix[i][j] == ‘0’) {

//表示这列无矩阵

height[j] = 0;

}else {

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-gH8PtWtx-1714868542962)]

[外链图片转存中…(img-Xcu5ZMlE-1714868542962)]

[外链图片转存中…(img-QCnQXabp-1714868542963)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值