代码随想录刷题记录 day50 每日温度+下一个更大元素 I

news2024/11/18 9:23:53

代码随想录刷题记录 day50 每日温度+下一个更大元素 I

739. 每日温度

在这里插入图片描述

思想

1.暴力解 两次for 超时了

2.单调栈

花了点时间理解的。

单调栈的基础入门题。找到一个数组中右边的第一个大于 等于 或者小于当前元素的下标的位置

以时间换空间,用一个栈来记录右边第一个比当前元素大的元素。只需要遍历一次就好了

栈里面存放的是元素的下标。需要处理以下三种情况

  1. 当前遍历的元素temperatures[i]小于栈顶元素temperatures[st.top()]的情况
  2. 当前遍历的元素temperatures[i]等于栈顶元素temperatures[st.top()]的情况
  3. 当前遍历的元素temperatures[i]大于栈顶元素temperatures[st.top()]的情况

因为本题是要找到大于的元素,所以对于1.2两种情况 直接将元素的下标插入到栈中就好了。

对于找到了右边第一个大于的元素,则进行以下的处理。

stack.peek() 记录着的是栈顶元素的下标

i-stack.peek()表示当前的这个元素和栈顶所记录的元素的距离

res[stack.peek()] 赋值

出栈

while()表示对当前栈内元素 所有小于temperatures[i]的值就要记录距离并出栈

最终将当前的元素入栈

//大于栈顶对应的元素
                //把所有小于的都弹出 同时记录数值
                while(!stack.empty() && temperatures[i]>temperatures[stack.peek()]){
                    res[stack.peek()]=i-stack.peek();
                    stack.pop();
                }
                stack.push(i);

代码

class Solution {
    // public int[] dailyTemperatures(int[] temperatures) {
    //     int [] ans=new int[temperatures.length];
    // 暴力解
    //     for(int i=0;i<temperatures.length;i++){
    //         for(int j=i+1;j<temperatures.length;j++){
    //             if(temperatures[j]>temperatures[i]){
    //                 ans[i]=j-i;
    //                 break;//跳出当前一层的循环
    //             }
    //         }
    //     }
    //     return ans;
    // }

    public int[] dailyTemperatures(int[] temperatures) {
        //单调栈 单调栈里存放元素的下标
        Stack<Integer> stack=new Stack<>();
        stack.push(0);
        int [] res=new int[temperatures.length];

        for(int i=1;i<temperatures.length;i++){
            if(temperatures[i]<temperatures[stack.peek()] ){
                //小于栈顶元素 直接入栈
                stack.push(i);
            }else if(temperatures[i]==temperatures[stack.peek()]){
                //等于也是直接入栈
                stack.push(i);
            }else{
                //大于栈顶对应的元素
                //把所有小于的都弹出 同时记录数值
                while(!stack.empty() && temperatures[i]>temperatures[stack.peek()]){
                    res[stack.peek()]=i-stack.peek();
                    stack.pop();
                }
                stack.push(i);
            }
        }
        return res;
    }
}

496. 下一个更大元素 I

在这里插入图片描述

思想

和前面一道题目的区别是这题目是两个数组,需要用一个hashmap来维护nums1的映射关系。

可以根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过

key: num1[i] value i

HashMap<Integer,Integer> hashMap=new HashMap<>();
        for(int i=0;i<nums1.length;i++){
            hashMap.put(nums1[i],i);
        }

栈中存放的是num1的下标

数组res来存放结果,根据题目要求 需要初始化为-1

讨论三种情况

  1. 当前遍历的元素nums2[i]小于栈顶元素nums2[stack.peek()]
  2. 当前遍历的元素nums2[i]等于栈顶元素nums2[stack.peek()]
  3. 当前遍历的元素nums2[i]大于于栈顶元素nums2[stack.peek()]

因为本题是找大于的 所以对于1.2两种,只要往栈里添加元素就好了。

考虑第三种情况,需要进行以下几个步骤

stack.peek() 栈顶元素,存放的是nums1的下标

nums2[stack.peek()] 获得具体元素的值

判断当前nums2的元素在nums1中是否出现过

出现过 index记录元素在nums1中的下标的位置

把元素弹出栈

				while(!stack.empty() && nums2[i]>nums2[stack.peek()]){
                    if(hashMap.containsKey(nums2[stack.peek()])){
                        int index=hashMap.get(nums2[stack.peek()]);
                        res[index]=nums2[i];
                    }
                    stack.pop();
                }
                stack.push(i);

代码

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        //nums1 是nums2的子集  nums1中的值在nums2中都能找到
        Stack<Integer> stack=new Stack<>();
        int [] res=new int[nums1.length];
        Arrays.fill(res,-1);
        //用一个hashmap 来做映射 可以根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过
        HashMap<Integer,Integer> hashMap=new HashMap<>();
        for(int i=0;i<nums1.length;i++){
            hashMap.put(nums1[i],i);
        }
        System.out.println(hashMap);

        //单调递增栈中存放的是nums1的下标
        stack.push(0);

        for(int i=1;i<nums1.length;i++){
            if(nums2[i]<nums2[stack.peek()]){
                //小于栈顶元素
                stack.push(i);
            }
            else if(nums2[i]==nums2[stack.peek()]){
                stack.push(i);
            }
            else{
                //nums2 中的下一个元素比栈顶的元素大了 涉及到入栈和出栈的操作
                //只是这一题需要先找到nums1中是否含有当前栈顶元素对应的元素
                //如果有 则要记录结果
                //如果没有 则直接出栈就好了
                while(!stack.empty() && nums2[i]>nums2[stack.peek()]){
                    if(hashMap.containsKey(nums2[stack.peek()])){
                        int index=hashMap.get(nums2[stack.peek()]);
                        res[index]=nums2[i];
                    }
                    stack.pop();
                }
                stack.push(i);
            }
        }

        return res;
    }
}

参考:代码随想录

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

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

相关文章

明道云联合RestCloud打造APaaS+IPaaS融合解决方案

背景介绍 APaaSIPaaS发展趋势 随着企业规模的扩张以及业务需求变化越来越快&#xff0c;企业现有IT系统无法快速应对前端敏捷化的需求。企业IT架构将朝着敏捷化、低代码化、服务化方向发展&#xff0c;而APaaSIPaaS解决方案在这种需求下应运而生&#xff0c;IPaaS可以把现有固…

ARAS plm安装,各种踩坑

目录准备工作sql server安装NET Framework安装许可申请IIS服务开启IIS无法启动报错 HTTP 错误 500.19 - Internal Server Error错误变为 aras Error: Cannot access OAuth Server due to 500 (Internal Server Error)**Aras安装准备工作 sql server安装 登录出现的几个错误 s…

Python数据分析挖掘案例:Python爬虫助力疫情数据追踪

通过学习Python数据分析挖掘案例&#xff0c;可以掌握通过Python爬虫获取的数据进行处理以及可视化分析的主要方法和技能&#xff0c;并为后续相关课程学习及将来从事数据分析工作奠定基础。 新冠病毒疫情在武汉突然爆发&#xff0c;确诊病例、疑似病例、死亡病例等数据牵动着每…

Binary number

A binary number is a number expressed in the base-2 numeral system or binary numeral system, a method of mathematical expression which uses only two symbols: typically “0” (zero) and “1” (one). The base-2 numeral system is a positional notation with a…

5G FWA市场一跃而上,四信多款5G终端赋能FWA典型应用

随着国家政策相继出台&#xff0c;全球5G基础设施建设日益完善&#xff0c;带动千行百业的巨大变革。以工业互联网、远程医疗、车联网、消费级硬件等为例的应用场景均在5G加持下实现跨越式升级。与此同时&#xff0c;5G FWA作为弥合光纤欠发达地区数字鸿沟挑战的“杀手级应用”…

【kafka】学习笔记(一)

学习笔记一、概述1.1、MQ1.2、kafka1.3、消息队列的两种模式1.3.1、点对点1.3.2、订阅与发布1.4、Kafka基础架构二、安装2.1、 集群规划2.2、 下载安装2.3、 集群启动脚本三、Kafka命令行操作3.1、主题命令行操作3.2、生产者命令行操作3.3、消费者命令行操作四、 Kafka 生产者4…

常用的Linux命令介绍

ls&#xff1a; 如何区分一个文件类型是 文件夹 还是 普通文件&#xff1a; “-” 类型 表示是 普通文件 “d” 类型 表示是 文件夹 cd&#xff1a; cd -返回进入此目录前所在的目录 cd ~如果是root用户&#xff0c;相当于 cd /root&#xff1b;如果是普通用户&#xff0c;相…

7、操作系统之间的文件传输

Windows 与 Linux 在Windows与Linux中传输文件的常用方式有两种&#xff0c;一种是使用使用XFTP工具&#xff0c;另一种是使用rz sz 命令的方式进行 lrzsz 安装 yum install lrzsz -y 1&#xff09;rz 将文件从window上传到Linux 2&#xff09;sz 将文件从linux传输到window …

常用排序算法哪个效率更高之从理论到实践

前面整理了一篇关于排序算法的基础类库&#xff1a;基本排序算法类SortHelper 这里我们来看看这几个算法哪个效率更高一点呢&#xff1f; 1、先从理论来看看这几个算法 1、冒泡排序法 基本思想&#xff1a;两两比较待排序数据元素的大小&#xff0c;发现两个数据元素的次序…

RSA和AES的使用

文章目录为什么要对数据传输加密对称加密和非对称加密密钥的几种格式非对称加密算法----RSA算法产生公私密钥对对称加解密算法AES为什么要结合使用这两种算法利用RSA来加密传输AES的密钥&#xff0c;用AES来加密数据&#xff0c;思路如下&#xff1a;特点分析&#xff1a;参考链…

【探索Spring底层】14.谈谈参数解析器

文章目录1. 参数解析器概述2. 常见参数的解析1. 参数解析器概述 参数解析器是Spring-Web包提供的组件&#xff0c;并且SpringMVC中提供了很多参数解析器。 常见的参数解析器如下 org.springframework.web.method.annotation.RequestParamMethodArgumentResolverabbc908org.s…

部署并启动项目在linux(CentOS7)上,一名合格的程序猿不能不会(ಥ_ಥ)

各位小伙伴大家好呀哈哈哈~ 遇到问题不要慌─≡Σ(((つ•̀ω•́)つ让我先发个朋友圈~( • ̀ω•́ )✧ 我们知道项目的正常运行是需要先部署在服务器上&#xff0c;然后才能正常使用&#xff0c;我们一般都是在idea下写好然后直接部署在tomcat上或者其他服务器&#xff0c;但…

多维表需求管理表自动生成TAPD需求

【实现效果&#xff1a;】业务同学使用多维表管理客户需求&#xff0c;和产品团队经过评审之后&#xff0c;一键把多维表里对应的需求生成TAPD需求/缺陷单 【准备工作】 准备一个多维表&#xff0c;比如维格表、金山轻维表等 可以参考这两个模版&#xff1a; 金山轻维表&am…

【深入浅出Spring原理及实战】「开发实战系列」Aspectj和LoadTimeWeaving的动态代理技术实现指南

前提介绍 当我们聊到Spring框架的项目实际开发中&#xff0c;用的强大的功能之一就是&#xff08;面向切面编程&#xff09;的这门AOP技术。如果使用得当&#xff0c;它的最大的作用就是侵入性比较少并且简化我们的工作任务&#xff08;节省大量的重复性编码&#xff09;&…

【QT】PySide6 数据可视化折线图

一、项目介绍 本项目将通过PySide6构建一个可以显示数据折线图的可视化程序&#xff0c;其中&#xff0c;数据来源时美国地质调查局(US Geological Survey)上公开的一小时地震震级数据。 可以通过链接进行下载。 二、实现步骤 本项目的实现步骤可以概括为&#xff1a; 读取…

艾美捷过氧化氢酶检测试剂盒的功能和应用

过氧化氢酶&#xff08;EC 1.11.1.6&#xff1b;2H2O2氧化还原酶&#xff09;是一种普遍存在于大多数需氧细胞中的抗氧化酶。过氧化氢酶&#xff08;CAT&#xff09;参与过氧化氢&#xff08;H2O2&#xff09;的解毒&#xff0c;过氧化氢是一种活性氧&#xff08;ROS&#xff0…

领域首创!合合信息与上海大学联合开启贵州原生态古彝文典籍数字化项目

古彝文传承至今已有数千年历史&#xff0c;是世界上最古老的文字之一。2022年12月21日&#xff0c;合合信息与上海大学社会学院正式签署校企合作协议&#xff0c;双方将合力完成以国家珍贵古籍《西南彝志》为中心的贵州古彝文图像识别及数字化校对项目&#xff08;简称“古彝文…

搜索与图论---最短路

最短路:建图! 源点—起点汇点—终点约定n为点数,m为边数1单源最短路:求一个点到其他所有点的最短路 1.1所有边权都是正数 (1)朴素的Dijkstra算法(On^2) 例题:Dijkstra求最短路 I 代码: #include<iostream> #include<cstring> #

代码随想录算法训练营第42天 | 01背包问题 416. 分割等和子集

01背包问题 由于leetcode上没原题&#xff0c;故参考卡哥意见自己编题记录一下。 一、题干 背包最大重量为4。物品为&#xff1a; 物品名称重量价值011513202430––– 问背包能背的物品最大价值是多少&#xff1f; 二、解法 二维dp&#xff1a; 递推公式&#xff1a;dp[i…

数组方法中会更改原数组,不会更改原数组(详细)

1.不会改变原来数组的有&#xff1a; concat() 连接两个或更多的数组&#xff0c;并返回结果。 如果arr.concat&#xff08;&#xff09;里面不放数组参数&#xff0c;则会浅拷贝arr 如果参数不是数组&#xff0c;它不会递归到嵌套数组参数中 数据类型如字符串&#xff0c;数…