秋招打卡011(20230807)

news2024/11/27 12:33:03

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、算法----》单调栈
    • 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 case
        int 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.coloradmin.cn/o/844218.html

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

相关文章

整理mongodb文档:集合名字有类似-等特殊字符串如何处理?

个人博客 整理mongodb文档:集合名字有类似-等特殊字符串如何处理&#xff1f; 首先&#xff0c;先创建一个collection的名字为’collection-test’&#xff0c;这个表名中&#xff0c;colletion的名字有一个特殊字符串“-”&#xff0c;但是后面插入数据的时候会有这么一个错…

SpringCloud(29):Nacos简介

1 什么是配置中心 1.1 什么是配置 应用程序在启动和运行的时候往往需要读取一些配置信息&#xff0c;配置基本上伴随着应用程序的整个生命周期&#xff0c;比如&#xff1a;数据库连接参数、启动参数等。 配置主要有以下几个特点&#xff1a; 配置是独立于程序的只读变量 …

瑞芯微RK3568核心板-4G联网测试

​ &#x1f308;引言 RK3568是瑞芯微针对AIOT和工业市场推出的一款高性能、低功耗、功能丰富的应用处理器。它采用了四核ARM架构64位Cortex-A55处理器&#xff0c;主频高达2.0GHz&#xff0c;集成瑞芯微自研1TOPS算力NPU, 同时集成Mali-G52 2EE GPU&#xff0c;支持4K60fps …

【javaSE】 万字带你认识异常

异常目录 异常的概念与体系结构异常的概念算术异常数组越界异常空指针异常 异常的体系结构 异常的分类编译时异常运行时异常 异常的处理防御式编程LBYL&#xff1a;事前防御型EAFP&#xff1a;事后认错型 异常的抛出注意事项 异常的捕获异常声明throws注意事项 try-catch捕获并…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(35)-Fiddler如何抓取微信小程序的包-下篇

1.简介 通过前边和宏哥的学习&#xff0c;我们了解到Android 7.0 之后增加了对第三方证书的限制&#xff0c;抓包工具&#xff08;charles、fiddler等&#xff09;提供的证书都无法通过校验&#xff0c;也就无法抓取HTTPS请求了&#xff0c;对测试工作影响很大。最近更新的微信…

idea导入新项目报异常:Error:java: Compilation failed: internal java compiler error

修改settings中项目对象Java编译配置恢复正常。 标记的两个地方配置修改和项目一样后&#xff0c;正常。

15年前,互联网蓬勃发展时,你是否还记得这几个标志软件?

互联网蓬勃发展了几十年里&#xff0c;创造很多经典&#xff0c;也成就了很多人物。 我们熟知的有&#xff1a;微软的创始人比尔盖茨&#xff0c;亚马逊的创始人杰夫贝索斯&#xff0c;Google的创始人拉里佩奇等。 给各行各业带来了翻天覆地的变化。 你还记得“IE”吗&#xff…

【云原生】kubernetes中容器的资源限制

目录 1 metrics-server 2 指定内存请求和限制 3 指定 CPU 请求和限制 资源限制 在k8s中对于容器资源限制主要分为以下两类: 内存资源限制: 内存请求&#xff08;request&#xff09;和内存限制&#xff08;limit&#xff09;分配给一个容器。 我们保障容器拥有它请求数量的…

【C++】做一个飞机空战小游戏(六)——给两架飞机设置不同颜色(cout输出彩色字符、结构体使用技巧)

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

docker安装neo4j

参考文章&#xff1a; 1、Mac 本地以 docker 方式配置 neo4j_neo4j mac docker_Abandon_first的博客-CSDN博客 2、https://www.cnblogs.com/caoyusang/p/13610408.html 安装的时候&#xff0c;参考了以上文章。遇到了一些问题&#xff0c;记录下自己的安装过程&#xff1a; …

ABP:BackgroundJob/Quartz 结合业务实现定时发送

需求描述&#xff1a;我在使用ABP框架&#xff0c;现在想实现一个定时任务功能&#xff0c;描述&#xff1a;每天八点调用特定接口&#xff0c;调用n次后结束不再调用。相关的数据都来自于一个特定的实体“fuck”。 解决方案&#xff1a;可以使用ABP框架自带的定时任务功能来实…

浅聊Cesium.js 后处理原理

浅聊Cesium.js 后处理原理 使用例子: const stages viewer.scene.postProcessStages;const silhouette Cesium.PostProcessStageLibrary.createSilhouetteStage() silhouette.enabled true; stages.add(silhouette);silhouette.uniforms.color Cesium.Color.LIME;涉及到相…

linux内网穿透应用场景有哪些?快解析有什么用处?

随着网络技术的不断发展&#xff0c;无论是工作上还是在生活中人们对网络的依赖和需求越来越高。Linux内网穿透作为一种创新的解决方案&#xff0c;为我们提供了无限可能。 首先我们了解一下Linux操作系统。Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基…

流量卡线上销户全教程,剩余的话费还有可能给你退回来!

线上就可以注销手机卡你知道吗&#xff1f;目前三大运营商都开通了线上销户业务了&#xff0c;而且用不完的话费还可以退回来&#xff0c;建议大家点赞收藏起来&#xff0c;以免有需要的时候找不到了&#xff0c;大家好&#xff0c;我是流量卡葫芦妹。 ​ OK&#xff0c;不多废…

进程、线程、协程

目录 进程、线程、协程的概念 进程、线程、协程的上下文切换 使用协程的注意事项 协程与线程、进程的区别 进程、线程、协程的概念 进程&#xff1a; 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程…

redis原理 1:鞭辟入里 —— 线程 IO 模型

Redis 是个单线程程序&#xff01;这点必须铭记。 也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉&#xff0c;它就是单线程&#xff0c;你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程&#xff0c;除了 Redis 之外&#xff0c;Node.js 也是单线程&#xff0c…

封装上传文件组件(axios,onUploadProgress,取消请求)

目录 定时模拟进度条 方法 A.axios B.xhr 取消请求​​​​​​​ 完整代码 A.自定义上传组件 B.二次封装组件 情况 增加cancelToken不生效&#xff0c;刷新页面 进度条太快->设置浏览器网速 定时模拟进度条 startUpload() {if (!this.file) return;const totalS…

AWS 中文入门开发教学 49- S3 - 区域间复制

知识点 S3 存储桶内容在全球区域间进行复制官网 https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/replication.html 实战演习 在东京区建立存储桶 Name: woyaofuzhi启用版本控制(完成区域间复制必须开启版本控制) 在新加坡区建立存储桶 Name: woyaofuzhibac…

科技感响应式管理系统后台登录页ui设计html模板

做了一个科技感的后台管理系统登录页设计&#xff0c;并且尝试用响应式布局把前端html写了出来&#xff0c;发现并没有现象中的那么容易&#xff0c;chrome等标准浏览器都显示的挺好&#xff0c;但IE11下面却出现了很多错位&#xff0c;兼容起来还是挺费劲的&#xff0c;真心不…

【Python从入门到进阶】31、使用JSONPath解析淘票票网站地区接口数据

接上篇《30、JSONPath的介绍和使用》 上一篇我们介绍了JSONPath的基础和具体使用&#xff0c;本篇我们来具体使用JSONPath&#xff0c;来解析淘票票网站的地区接口数据。 一、引言 1、JsonPath的作用和用途&#xff1f; JsonPath是一种用于在JSON数据中进行查询和提取的表达…