秋招打卡011(20230807)

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、算法----》单调栈
    • 1、介绍
    • 2、题目
  • 总结


前言

提示:这里为每天自己的学习内容心情总结;

Learn By Doing,Now or Never,Writing is organized thinking.

今天拿到了上周面试的结果,说我基础不错以为能进,结果名额不够了。

有点焦虑,努力吧,秋招才刚开始呢。


提示:以下是本篇文章正文内容

一、今天学习了什么?

  • 写完了代码随想录的单调栈部分的算法题;
  • 其它的没做;

二、算法----》单调栈

1、介绍

如果要在一维数组中,寻找任意一个元素的右边或者是左边第一个比自己大或者小的元素的位置,可以采用「单调栈」,时间复杂度为O(N)。

利用一个栈记录在遍历过程中记录遍历过的元素,重点:

  • 单调栈内只需要存放元素的下标即可;
  • 单调栈内的顺序(顺序是指栈头到栈底),分为:
    • 如果求一个元素右边第一个更大元素,单调栈就是递增的;
    • 如果求一个元素右边第一个更小元素,单调栈就是递减的。

用 temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

739.每日温度2

2、题目


  • 739. 每日温度;(⭐⭐⭐⭐⭐)
    public int[] dailyTemperatures(int[] temperatures) {/*** - 采用一个单调栈进行遍历数据* - 每次都需要找到当前元素的右边第一个更大的元素* - 栈底到栈尾存放元素应该是由大到小* - 比较栈顶元素和即将入栈元素的大小:*  - 当栈顶元素温度小于即将入栈元素的温度时,弹出栈顶元素并设置结果集*  - 重复弹出,直至栈为空或者栈顶元素大于入站元素*/Stack<Integer> stack = new Stack<>();stack.push(0);int[] result = new int[temperatures.length];for (int i = 1; i < temperatures.length; i++) {while (!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]) {Integer pop = stack.pop();result[pop] = i - pop;}stack.push(i);}return result;}
  • 496. 下一个更大元素 I;
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {/*** - 还是使用单调栈,存储在nums2数组中,找到比当前元素大的元素下标* - 利用一个map维持映射关系 key是nums2的元素值,value是nums2的元素下标* - result保存的是nums2中当前元素的下一个更大元素的下标*/Map<Integer, Integer> map = new HashMap<>();Stack<Integer> stack = new Stack<>();int[] result = new int[nums2.length];Arrays.fill(result, -1);for (int i = 0; i < nums2.length; i++) {while (!stack.isEmpty() && nums2[i] > nums2[stack.peek()]) {Integer pop = stack.pop();result[pop] = i;}stack.push(i);map.put(nums2[i], i);}int[] ans = new int[nums1.length];for (int i = 0; i < nums1.length; i++) {int index = result[map.get(nums1[i])];if (index == -1) {ans[i] = -1;} else {ans[i] = nums2[index];}}return ans;}
  • 503. 下一个更大元素 II;
    public int[] nextGreaterElements(int[] nums) {/*** - 还是采用栈结构,由于是一个循环数组,所以需要遍历数组中的元素次数多一点*/int length = nums.length;int[] ans = new int[length];Arrays.fill(ans, -1);Stack<Integer> stack = new Stack<>();for (int i = 0; i < 2 * length; i++) {while (!stack.isEmpty() && nums[i % length] > nums[stack.peek()]) {Integer pop = stack.pop();ans[pop] = nums[i % length];}stack.push(i % length);}return ans;}
  • 42. 接雨水;(⭐⭐⭐⭐⭐)
    // 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。/**height: 数组,柱子高度*/public int trap(int[] height) {// base caseint length = height.length;if(length <= 2){return 0;}// 定义一些变量int sum = 0;// 最后接的雨水值// 单调栈,栈顶到栈底是,按照元素值从小到大,但是存储的是数组中元素下标Stack<Integer> stack = new Stack<>();stack.push(0);for(int i = 1; i < length; i++){// 栈中是一定存在元素的int stackTopIndex = stack.peek();// 栈顶中元素对应在height数组中的下标// 如果新加入的元素,比栈顶的元素小,直接压入栈中if(height[i] < height[stackTopIndex]){stack.push(i);}else if(height[i] == height[stackTopIndex]){// 如果新加入的元素,和栈顶的元素值相同,弹出栈顶元素,并且将新元素加入栈中stack.pop();stack.push(i);}else{// 情况三:要压入栈中的元素值,大于栈顶的元素值int top = stack.peek();// 遍历每一个比即将压入栈中小的元素while(!stack.isEmpty() && height[i] > height[top]){int cur = stack.pop();// 当前元素为高度// 算雨水量是根据宽度*高度if(!stack.isEmpty()){int left = stack.peek();int h = Math.min(height[left], height[i]) - height[cur];int w = i - left - 1;int res = h * w;sum += res;top = stack.peek();}}stack.push(i);}}return sum;}
  • 84. 柱状图中最大的矩形;
    public int largestRectangleArea(int[] heights) {/*** - 采用单调栈,栈里存储元素下标* - 栈底到栈顶的元素是从小到大* - 遍历数组中的元素和栈顶相比,只有当即将入栈的元素小于栈顶元素时,需要计算矩形的面积* - 需要重新设置数组元素*/int[] arr = new int[heights.length + 2];for (int i = 0; i < heights.length; i++) {arr[i + 1] = heights[i];}int ans = 0;Stack<Integer> stack = new Stack<>();stack.push(0);for (int i = 1; i < arr.length; i++) {int peek = stack.peek();if (arr[i] > arr[peek]) {stack.push(i);} else if (arr[i] == arr[peek]) {stack.pop();stack.push(i);} else {while (!stack.isEmpty() && arr[i] < arr[peek]) {peek = stack.pop();int mid = arr[peek];peek = stack.peek();int width = i - peek - 1;ans = Math.max(ans, mid * width);}stack.push(i);}}return ans;}


总结

提示:这里对文章进行总结:

记住单调栈用的场景,求数组中离该元素最近的最小或者最大的元素。

遍历数组元素的时候,按照从小到大或者从大到小的顺序添加元素,注意情况的比较和出入栈的时机。

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

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

相关文章

C#--调用Python(包含第三方库)

1. C# 调用 Python 常见的方法有4种 参考链接 1.1 Pythonnet &#xff08;推荐&#xff09; 可以很好的支持第三方库。 推荐这个&#xff0c;经本人验证这个很好用。 后文 2. 详细使用。 1.2 IronPython 如果使用第三方库就放弃这个吧&#xff0c;真的用不了&#xff0c;使…

SSM的知识点考试系统java在线问答试卷管理jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 SSM的知识点考试系统 系统1权限&#xff1a;管理员 …

开源免费用|Apache Doris 2.0 推出跨集群数据复制功能

随着企业业务的发展&#xff0c;系统架构趋于复杂、数据规模不断增大&#xff0c;数据分布存储在不同的地域、数据中心或云平台上的现象越发普遍&#xff0c;如何保证数据的可靠性和在线服务的连续性成为人们关注的重点。在此基础上&#xff0c;跨集群复制&#xff08;Cross-Cl…

一文教你看懂Golang协程调度【GMP设计思想】

一文教你看懂Golang协程调度【GMP设计思想】 1 Golang调度器的由来 1.1 单进程的问题&#xff1a;进程阻塞、CPU浪费时间 单一执行程序、计算机只能一个任务一个任务来进行处理进程阻塞所带来的CPU浪费时间 1.2 多进程、多线程问题&#xff1a;设计复杂、高内存、CPU占用 设计…

ad+硬件每日学习十个知识点(24)23.8.4(时序约束,SignalTap Ⅱ)

文章目录 1.建立时间和保持时间2.为什么要建立时序约束&#xff1f;3.SignalTap Ⅱ4.SignalTap Ⅱ使用方法5.HDL的仿真软件&#xff08;modelsim&#xff09;6.阻抗匹配 1.建立时间和保持时间 答&#xff1a; 2.为什么要建立时序约束&#xff1f; 答&#xff1a; 3.Sign…

Xposed回发android.os.NetworkOnMainThreadException修复

最近用xposed进行hook回发的时候&#xff0c;又出现了新的问题&#xff1b; android.os.NetworkOnMainThreadException&#xff1b; 在Android4.0以后&#xff0c;写在主线程&#xff08;就是Activity&#xff09;中的HTTP请求&#xff0c;运行时都会报错&#xff0c;这是因为…

【云原生】Docker-compose中所有模块学习

compose模块 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令关键字也比较多。但大家不用担心&#xff0c;这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml&#xff0c;格式为 YAML 格式。 version: "3&quo…

node爬取中国行政区域geo数据

依赖 {"dependencies": {"axios": "^1.4.0","colors": "^1.4.0","express": "^4.18.2","fs": "^0.0.1-security"} }数据来源 https://datav.aliyun.com/portal/school/atlas/are…

c++实现Qt信号和槽机制

文章目录 简介信号槽信号与槽的连接 特点观察者模式定义观察者模式结构图 实现简单的信号和槽 简介 信号槽机制与Windows下消息机制类似&#xff0c;消息机制是基于回调函数&#xff0c;Qt中用信号与槽来代替函数指针&#xff0c;使程序更安全简洁。  信号和槽机制是 Qt 的核心…

ViSQOL、PESQ、mosnet等mos分打分工具和Polqa语音感知音质打分测评

原创&#xff1a;转载需附链接&#xff1a; https://blog.csdn.net/qq_37100442/article/details/132057139?spm1001.2014.3001.5502 一、背景 Mos分评价音质重要指标&#xff0c;最近也有很多机构和公司在研究适合自己的评价体系。目前Mos分主要分为主观评测和客观感知评价。…

【项目多人协作的困扰】git-cli 解决 git merge 合并时 lock 文件变化,忘记重新安装依赖的问题

项目多人协作的困扰 相信大家多多少少都遇到过&#xff0c;当主线分支的代码&#xff0c;合入到自己的分支的时候&#xff0c;如果这时候&#xff0c;主线中有一些依赖的更新或者添加或者删除&#xff0c;如果合入之后&#xff0c;没有及时的install的话&#xff0c;项目启动的…

从零构建深度学习推理框架-6 构建计算图

PNNX PNNX项目 PyTorch Neural Network eXchange&#xff08;PNNX&#xff09;是PyTorch模型互操作性的开放标准。PNNX为PyTorch提供了一种开源的模型格式&#xff0c;它定义了与Pytorch相匹配的数据流图和运算图&#xff0c;我们的框架在PNNX之上封装了一层更加易用和简单的计…