求职Leetcode题目(2)

news2025/2/25 3:23:05

 1.柱状图中最大的矩形

据说这是2024年字节二面的题目,我感觉这道题跟接雨水有点类似,最重要的思路还是要找到什么时候能形成矩形的这么个情况,某个范围的矩形的高度,是由最短的柱形来决定的。

我们先整理一下,解决这道题,我们要知道高和宽,高好解决,至于这个宽,我们要注意宽的长度是取决于范围内最矮高度的柱子

这道题首先我们想到的思路是用栈,因为我们每次往后遍历元素的时候,我们需要找到一个元素比上一个小的元素,找到了之后,我们从这个元素开始一个一个向里扩张,计算每次的宽和高,这就需要我们每次用完一个元素然后抛掉,这符合先进后出的思想,所以这就是我们用栈的原因。

  • 基本思路是枚举每一个高度的左右边界,所以我们定义:
  • left数组:表示高度为heights[i]的左边界
  • right数组:表示高度为heights[i]的右边届
  • 左右边界都是高度满足:大于等于heights[i]的下一个位置,所以我们计算的时候是heights[i] * (right[i] - left[i]-1)
  • 默认高度为heights[i]的右边届为len;
  • 遍历数组中的元素,在栈中始终存储升序排序的比heights[i]小的下标
  • 所以如果栈不为空且高度大于heights[i],我们让它出栈,并且赋予右边届为i,直到一个小于heights[i]的栈中元素或者栈为空
  • 如果栈长度为0,那么说明没有比它小的,所以左边界为-1,否则左边届为栈顶的元素
  • 遍历高度为heights[i]的左右边界进行计算,找出最大值即可。

 

 

 

public class CallerTask{
    public static int largestRectangleArea(int[] heights) {
        // 初始化最终结果为0
        int res = 0;
        int n =heights.length;
        Stack<Integer> stack = new Stack<>();

        int[] newHeights = new int[n + 2];
        newHeights[0] = 0;
        newHeights[newHeights.length-1] = 0;
        for (int i = 1; i < heights.length + 1; i++) {
            newHeights[i] = heights[i - 1];
        }

        // 开始遍历
        for (int i = 0; i < newHeights.length; i++) {
            // 如果栈不为空且当前考察的元素值小于栈顶元素值,
            // 则表示以栈顶元素值为高的矩形面积可以确定
            while (!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]) {
                // 弹出栈顶元素
                int cur = stack.pop();
                // 获取栈顶元素对应的高
                int curHeight = newHeights[cur];

                // 栈顶元素弹出后,新的栈顶元素就是其左侧边界
                int leftIndex = stack.peek();
                // 右侧边界是当前考察的索引
                int rightIndex = i;
                // 计算矩形宽度
                int curWidth = rightIndex - leftIndex - 1;

                // 计算面积
                res = Math.max(res, curWidth * curHeight);
            }

            // 当前考察索引入栈
            stack.push(i);
        }

        return res;
    }
}

2.最大矩形

如果我们把矩阵看作:以第三行为底边,每一列从下往上连续的1的个数作为高度的柱状图,如图所示:

  • 问题就转化成了柱状图中最大的矩形
  • 直接套用那一题的解法,就可以以O(n)的复杂度算出该柱状图中最大的矩形的面积是 6
  • 但是这例子中只是特别选取了第3行作为底边,事实上选择哪一行作为底边是不确定的。
  • 因此这道题我们需要对矩阵中以每一行作为底边的柱状图都求解一次最大矩形面积,再取最大值作为答案即可。

 

 

 

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if (matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        int m = matrix.length;
        int n = matrix[0].length;
        int res = 0;
        // 柱状图高度数组。 前后增加一个高度为0的 “哨兵”,避免判断栈空,简化代码
        int[] heights = new int[n + 2];
        // 对每i行及以上看成柱状图,求一次“柱状图中的最大矩形”
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {   
                // 每一列的高度,要么为0,要么是上一行该列高度 + 1
                heights[j + 1] = matrix[i][j] == '0' ? 0 : 1 + heights[j + 1];
            }
            // 单调栈法求解 “柱状图最大矩形”
            Deque<Integer> stack = new ArrayDeque<>(m);
            stack.addLast(0);
            for (int j = 1; j < heights.length; j++) {
                while (heights[j] < heights[stack.peekLast()]) {
                    int h = heights[stack.pollLast()];
                    int w = j - stack.peekLast() - 1;
                    res = Math.max(res, h * w);
                }
                stack.addLast(j);
            }
        }
        return res;
    }
}

 3.括号生成

通过观察我们可以发现,生成的任何括号组合中都有两个规律:

1,括号组合中左括号的数量等于右括号的数量
2,括号组合中任何位置左括号的数量都是大于等于右括号的数量
第一条很容易理解,我们来看第二条,比如有效括号"(())()",在任何一个位置右括号的数量都不大于左括号的数量,所以他是有效的。如果像这样"())()"第3个位置的是右括号,那么他前面只有一个左括号,而他和他前面的右括号有2个,所以无论如何都不能组合成有效的括号。搞懂了上面的原理,我们就以n等于2为例来画个图看一下。

    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        dfs(res, n, n, "");
        return res;
    }

    private void dfs(List<String> res, int left, int right, String curStr) {
        if (left == 0 && right == 0) { // 左右括号都不剩余了,说明找到了有效的括号
            res.add(curStr);
            return;
        }
        //左括号只有剩余的时候才可以选,如果左括号的数量已经选完了,是不能再选左括号了。
        //如果选完了左括号我们是还可以选择右括号的。
        if (left < 0)
            return;
        // 如果右括号剩余数量小于左括号剩余的数量,说明之前选择的无效
        if (right < left)
            return;
        //选择左括号
        dfs(res, left - 1, right, curStr + "(");
        //选择右括号
        dfs(res, left, right - 1, curStr + ")");
    }

 

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

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

相关文章

解决Firefox代理身份验证弹出窗口问题:C#和Selenium实战指南

引言 在使用Selenium和C#进行网页抓取时&#xff0c;遇到代理服务器的身份验证弹出窗口是一个常见的问题。这不仅会中断自动化流程&#xff0c;还会导致抓取任务失败。本文将提供一个实战指南&#xff0c;帮助开发者解决这个问题&#xff0c;并介绍如何在代码中设置代理IP、Us…

N32L406 移植MultiTimer教程 mdk5

MultiTimer 首先感谢开源作者 开源地址&#xff1b; github.com https://github.com/0x1abin/MultiTimer 简介 MultiTimer 是一个软件定时器扩展模块&#xff0c;可无限扩展你所需的定时器任务&#xff0c;取代传统的标志位判断方式&#xff0c; 更优雅更便捷地管理程序的…

C++学习笔记之指针高阶

数组名 数组名字是数组的首元素地址。 一个指针变量保存了数组元素的地址。我们就称之为数组元素指针,及数组指针。 数组指针的本质是指针,指向数组中的某个元素的地址。 由于数组名可以代表数组收元素地址,数组元素是可以通过 数组名[下标] 的格式访问, 那么可以定义一…

红酒行业新动态:抢先了解未来趋势

在风起云涌的红酒市场中&#xff0c;每一次变革都如同飓风般席卷整个行业。今日&#xff0c;我们一同探讨红酒行业的新动态&#xff0c;特别是定制红酒领域的未来趋势。让我们以洒派红酒&#xff08;Bold & Generous&#xff09;为引&#xff0c;洞察行业前沿&#xff0c;预…

60、redis安装和部署

一、关系型数据库与非关系型数据库 1.1、关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上一般面向于记录。SQL语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#xff0…

2024-07学习笔记

1.${}取值 在这些属性源中&#xff0c;命令行参数和JVM系统属性拥有最高的优先级&#xff0c;它们可以覆盖在Properties文件中定义的属性。而操作系统环境变量和Properties文件的优先级相对较低&#xff0c;但是Spring会根据配置的不同情况进行属性的合并和覆盖&#xff0c;最终…

QUARKUS初体验

1.什么是QUARKUS&#xff1f; Quarkus是 Red Hat为GraalVM 和 HotSpot 量身定制用程序。特点是启动超快&#xff0c;内存极低&#xff0c;并且在容器编排平台&#xff08;如Kubernetes&#xff09;中提供了近乎即时的向上扩展和高密度的内存利用率。并且基于GraalVM&#xff0…

【YashanDB知识库】如何远程连接、使用YashanDB?

问题现象 在各个项目实施中&#xff0c;我们经常遇到客户、开发人员需要连接和使用YashanDB但不知如何操作的问题&#xff0c;本文旨在介绍远程连接、使用YashanDB的几种方式。 问题的风险及影响 无风险 问题影响的版本 历史版本~23.2 问题发生原因 无 解决方法及规避方…

Pytorch基础:Tensor的连续性

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;一个连续的张量指的是张量中各数据元素在底层的存储顺序与其在张量中的位置一致。这意味着每一个元素的地址可以通过下面的线性映射公式来…

MySQL8--用户与权限管理

原文网址&#xff1a;MySQL8--用户与权限管理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍MySQL8的用户与权限的管理&#xff0c;包括&#xff1a;用户的创建与删除、授权与撤销权限等。 为什么要管理用户与权限&#xff1f; 目的是保证数据库的安全性&#xff0c;只授…

TCP/IP协议——使用Socket套接字实现

目录 Socket 使用Socket实现TCP客户端和服务器的过程 使用Socket搭建TCP服务器 线程优化 向客户端发送消息 连接的断开 客户端主动断开 服务端主动断开 服务器完整的程序 使用Socket编写客户端程序连接TCP服务器 Socket Socket是一种网络通信协议&#xff0c;它允许…

不再担心数据丢失:用rsync打造你的自动化备份解决方案

在现代IT环境中&#xff0c;数据备份是一项至关重要的任务。无论是个人文件还是企业数据&#xff0c;都需要有可靠的备份机制来防止数据丢失。今天&#xff0c;我们将介绍一种高效的备份方案&#xff1a;使用rsync实现自动化备份目录。 什么是rsync&#xff1f; rsync 是一个开…

vscode+cmake+msvc+vcpkg的入门使用

一.环境安装 1.下载vscode并安装: Download Visual Studio Code - Mac, Linux, Windows 2.安装完成后&#xff0c;安装C和cmake 相关工具&#xff0c;如图。 3.vcpkg的下载和安装 克隆vcpkg的仓库到本地&#xff1a;https://github.com/microsoft/vcpkg.git&#xff0c;运行bo…

《学会 SpringMVC 系列 · 基础篇》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

deeplapv3 动机

语义分割是计算机视觉领域中重要的任务之一&#xff0c;语义分割的目的是为图像中的每个像素分配标签。相比于传统方法&#xff0c;以深度学习为基础的全卷积网络极大地提高了语义分割算法的性能。 在语义分割网络中&#xff0c;常用到如下2种结构&#xff1a; 空间金字塔池化…

C++STL简介(三)

目录 1.vector的模拟实现 1.1begin&#xff08;&#xff09; 1.2end&#xff08;&#xff09; 1.3打印信息 1.4 reserve&#xff08;&#xff09; 1.5 size&#xff08;&#xff09; 1.6 capacity&#xff08;&#xff09; 1.7 push_back() 1.8[ ] 1.9 pop_back() 1.10 insert&…

【涵子来信】——AI革新:1.新时代是便捷的,要会用

各位读者朋友们&#xff1a; 我们现在AI时代的十字路口&#xff0c;AI是为生活带来便利的&#xff0c;我们要会使用AI。今天这篇文章来讲述一下AI的正确使用。 一、 AI的使用 1.1.便捷之中要会辨别 AI是带来强大的&#xff0c;利用好可以给生活带来便捷。 像之前WWDC24宣传…

SAP 字符串关键字找程序

关键字查询程序 &#xff1a; RPR_ABAP_SOURCE_SCAN或RS_ABAP_SOURCE_SCAN

Python网络爬虫:基础与实战!附淘宝抢购源码

Python网络爬虫是一个强大的工具&#xff0c;用于从互联网上自动抓取和提取数据。下面我将为你概述Python网络爬虫的基础知识和一些实战技巧。 Python网络爬虫基础 1. HTTP请求与响应 网络爬虫的核心是发送HTTP请求到目标网站并接收响应。Python中的requests库是处理HTTP请求…