备战秋招011(20230807)

news2024/12/26 12:35:20

文章目录

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

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

相关文章

选读SQL经典实例笔记19_Any和All

1. Any 1.1. 任意一个 1.2. 选修了任意一门课程的学生 1.2.1. 找出选修了至少一门课程的学生 1.3. 比任何火车都快的飞机 1.3.1. 找出比所有火车都快的飞机 2. All 2.1. 全部 2.2. 吃所有蔬菜的人 2.2.1. 没有任何一种蔬菜他们不吃 3. 问题12 3.1. 选修了全部课程的…

scikit-plot 使用笔记

scikit-plot是基于sklearn和Matplotlib的库&#xff0c;主要的功能是对训练好的模型进行可视化。 安装&#xff1a; pip install scikit-plot 功能1&#xff1a;评估指标可视化 scikitplot.metrics.plot_confusion_matrix快速展示模型预测结果和标签计算得到的混淆矩阵。 im…

ForkJoinPool详解

一、归并排序 1、简介 先把一个庞大的数组进行递归分解&#xff0c;把拆分的数组排好序&#xff0c;之后把拆分排好序的数组进行有序的合并&#xff0c;必须住的问题就是&#xff0c;递归拆分的阈值&#xff0c;比如当数组长度拆分到10000时候就不拆了&#xff0c;不能无限制…

TPU编程竞赛系列 | 创客北京2023·算能AI+边缘计算专项赛开始啦!

为助力北京市高精尖产业发展&#xff0c;构建大中小企业相互依存、相互促进的企业发展生态&#xff0c;打造北京市有影响力的双创服务品牌赛事&#xff0c;“创客北京”大赛组委会联合算能举办AI边缘计算方向专项赛。 1.赛题任务 本赛题基于“AI边缘计算”方向&#xff0c;针对…

21、springboot的宽松绑定及属性处理类的构造注入

springboot的宽松绑定及属性处理类的构造注入 ★ 如何使用属性处理类所读取的属性 属性处理类最终变成了Spring容器中的一个Bean组件&#xff0c;因此接下来Spring即可将该Bean组件注入任意其他组件。 这种做法的好处是&#xff1a;可以将大量的配置信息封装一个对象——所以…

利用openTCS实现车辆调度系统(三)车辆适配器解读,封装自己的适配器

适配器的官方解释&#xff1a;openTCS 支持自定义车辆驱动程序的集成&#xff0c;这些驱动程序实现特定于车辆的通信协议&#xff0c;从而在内核和车辆之间进行调解。 由于其功能&#xff0c;车辆驾驶员也称为通信适配器。 openTCS适配器。欢迎随时沟通 1、源码下载 github下…

arcgis宗地或者地块四至权利人信息提取教程

ARCGIS怎样将图斑四邻的名称及方位加入其属性表 以前曾发表过一篇《 如何把相邻图斑的属性添加在某个字段中》的个人心得,有些会员提出了进一步的要求,不但要相邻图斑的名称,还要求有方位,下面讲一下自己的做法。 基本思路是:连接相邻图斑质心,根据连线的角度确定相邻图斑…

动态规划(二)

一、线性DP 1.1数字三角形 #include<iostream> #include<algorithm>using namespace std;const int N 510,INF 1e9;int n; int a[N][N]; int f[N][N];int main() {scanf("%d",&n);for(int i 1;i < n;i ){for(int j 1;j < i; j )scanf(&qu…

【2.3】Java微服务:sentinel服务哨兵

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; Java微服务 ✨特色专栏&#xff1a; 知识分享 &am…

Spring 事务失效的八种场景

1. 抛出检查异常导致事务不能正确回滚 Service public class Service1 {Autowiredprivate AccountMapper accountMapper;Transactionalpublic void transfer(int from, int to, int amount) throws FileNotFoundException {int fromBalance accountMapper.findBalanceBy(from…

Butterfly 安装文档(一) 快速开始

安装 在你的Hexo根目录里面 git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly 应用主题 修改 Hexo 根目录下的 _config.yml&#xff0c;把主题改为 butterfly theme: butterfly 安装插件 如果你没有 pug 以及 stylus 的渲染…

字符串查找匹配算法

概述 字符串匹配&#xff08;查找&#xff09;是字符串的一种基本操作&#xff1a;给定带匹配查询的文本串S和目标子串T&#xff0c;T也叫做模式串。在文本S中找到一个和模式T相符的子字符串&#xff0c;并返回该子字符串在文本中的位置。 暴力匹配 Brute Force Algorithm&a…

20天突破英语四级高频词汇——第②天

2&#xfeff;0天突破英语四级高频词汇~第2天加油(ง •_•)ง&#x1f4aa; &#x1f433;博主&#xff1a;命运之光 &#x1f308;专栏&#xff1a;英语四级高频词汇速记 &#x1f30c;博主的其他文章&#xff1a;点击进入博主的主页 目录 2&#xfeff;0天突破英语四级高…

LouvainMethod分布式运行的升级之路

1、背景介绍 Louvain是大规模图谱的谱聚类算法&#xff0c;引入模块度的概念分二阶段进行聚类&#xff0c;直到收敛为止。分布式的代码可以在如下网址进行下载。 GitHub - Sotera/spark-distributed-louvain-modularity: Spark / graphX implementation of the distri…

SQL server 与 MySQL count函数、以及sum、avg 是否包含 为null的值

sql server 与 mysql count 作用一样。 count 计算指定字段出现的个数&#xff0c; 不是计算 null的值 获取表的条数 count(n) n:常数 count(1),count&#xff08;0&#xff09;等 count(*) count(字段) 其中字段为null 不会统计在内。 avg(字段)、sum(字段) 跟count(字段)…

数字孪生技术的实用价值体现在哪?

随着科技的不断进步&#xff0c;数字孪生技术已成为引领未来发展的重要驱动力。数字孪生是将现实世界与数字世界紧密结合的技术&#xff0c;通过创建虚拟的物理模型&#xff0c;实时模拟和分析真实世界中的物体和过程&#xff0c;让数字孪生在各个领域都展现出了巨大的潜力&…

通用Mapper的四个常见注解

四个常见注解 1、Table 作用&#xff1a;建立实体类和数据库表之间的对应关系。 默认规则&#xff1a;实体类类名首字母小写作为表名&#xff0c;如 Employee -> employee 表 用法&#xff1a;在 Table 注解的 name 属性中指定目标数据库的表名&#xff1b; 案例&#…

vscode extension 怎么区分dev prod

开发模式注入环境变量 使用vsode 提供的api

【返回时间字段问题--消息转换器】

文章目录 前言一、第一种方式一、第二种方式&#xff08;推荐 ) 前言 一、第一种方式 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式化 但这种方式&#xff0c;需要在每个时间属性上都要加上该注解&#xff0c;使用较麻烦&#xff0c;不能全局处理。 一、第二种方…

【数理知识】旋转矩阵的推导过程,基于向量的旋转来实现,同时解决欧式变换的非线性局限

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动&#xff0c;平动&#xff0c;转动4【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现5【数理知识】协…