首页 > 其他分享 >每日一题--2454.下一个更大元素IV

每日一题--2454.下一个更大元素IV

时间:2023-12-12 22:56:08浏览次数:34  
标签:nums 2454 元素 整数 IV 大于 tmp1 tmp2

题目链接:2454.下一个更大元素IV

题目:
给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数,你必须找到对应元素的 第二大 整数。
如果 nums[j] 满足以下条件,那么我们称它为 nums[i] 的 第二大 整数:

  • j > i
  • nums[j] > nums[i]
  • 恰好存在 一个 k 满足 i < k < j 且 nums[k] > nums[i] 。
    如果不存在 nums[j] ,那么第二大整数为 -1 。
  • 比方说,数组 [1, 2, 4, 3] 中,1 的第二大整数是 4 ,2 的第二大整数是 3 ,3 和 4 的第二大整数是 -1 。
    请你返回一个整数数组 answer ,其中 answer[i]是 nums[i] 的第二大整数。

示例1:

输入:nums = [2,4,0,9,6]
输出:[9,6,6,-1,-1]
解释:
下标为 0 处:2 的右边,4 是大于 2 的第一个整数,9 是第二个大于 2 的整数。
下标为 1 处:4 的右边,9 是大于 4 的第一个整数,6 是第二个大于 4 的整数。
下标为 2 处:0 的右边,9 是大于 0 的第一个整数,6 是第二个大于 0 的整数。
下标为 3 处:右边不存在大于 9 的整数,所以第二大整数为 -1 。
下标为 4 处:右边不存在大于 6 的整数,所以第二大整数为 -1 。
所以我们返回 [9,6,6,-1,-1] 。

示例2:

输入:nums = [3,3]
输出:[-1,-1]
解释:
由于每个数右边都没有更大的数,所以我们返回 [-1,-1] 。

思路:
题目难度困难,数据范围 1 <= nums.length <= 10^5,暴力过不了,想下其他办法。
题目要求找到下下个更大元素,可以先想到求下个更大元素,可以参考:739.每日温度,此题中我们通过使用一个单调栈得到\(O(n)\)的解法。本题在每日温度的基础上多求了次最大元素,我们也就可以在上题的基础上多加一个单调栈(先当于再记一次数),求得下下个更大元素
流程:
我们从左向右遍历,用一个单调栈\(tmp1\)进行维护,当前数\(x\)大于栈顶元素,就将栈顶出栈(直到\(x\)小于栈顶),\(x\)进栈。(这一步形象化理解是:当前遍历到\(i\),将\(0-i\)这一段中没有比自己大的元素存放于栈中)。
再使用一个栈\(tmp2\),将从\(tmp1\)中弹出的元素放入,这里相当于进行第二次计数,若当前数\(x\)大于栈顶元素,那么我们就找到了栈顶元素的下下个更大元素,记录到数组\(ans\)中,最后返回\(ans\)。
流程示例:
image

代码:

class Solution {  
public:  
    vector<int> secondGreaterElement(vector<int>& nums) {  
        int n = nums.size();  
        vector<int> ans(n, -1);  
        //栈内放的是坐标  
        stack<int> tmp1;  
        stack<int> tmp2;  
        for(int i = 0;i < nums.size(); i++){  
            while(!tmp2.empty() && nums[i] > nums[tmp2.top()]){  
                ans[tmp2.top()] = nums[i];  
                tmp2.pop();  
            }  
            stack<int> temp;  
            //进行双栈出入  
            //大于第一个栈顶  
            while(!tmp1.empty() && nums[i] > nums[tmp1.top()]){  
                int k = tmp1.top();  
                temp.push(k);  
                tmp1.pop();  
            }
            //调整栈内数据顺序
            while(!temp.empty()){  
                tmp2.push(temp.top());  
                temp.pop();  
            }  
            tmp1.push(i);  
        }  
        return ans;  
    }  
};

标签:nums,2454,元素,整数,IV,大于,tmp1,tmp2
From: https://www.cnblogs.com/TTS-TTS/p/17898047.html

相关文章

  • 基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI
    前言定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布、定时更新某一个业务状态、定时删除一些冗余数据等等。今天给大家推荐一个基于.NETCore+Quartz.NET +Vue+IView开箱即用的定时任务UI(不依赖数据库,只需在界面做简单配置):Quartz.NetUI。Quartz.......
  • [ARC133B] Dividing Subsequence
    DividingSubsequence这道题与最长公共子序列类似,可以先去水一水那道题。题意本题就是让你从\(p\)里面选出一个子序列\(b_i\)和\(q\)里面选出一个子序列\(a_i\),我们要使\(b_i\)是\(a_i\)的倍数。解法本题直接用动态规划,是\(O(n^2)\)做法,会超时,因此我们用树状数......
  • docker启动容器报错:Error response from daemon: driver failed programming external
    安装的docker启动报错如下:Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointnacos(2b0f4edff8f640559af9626936d1b38d965302ef525af483716e8e8c9121583e):(iptablesfailed:iptables--wait-tnat-ADOCKER-ptcp-d0/0--dp......
  • Hive的NVL()函数
    Hive的NVL()函数是用于处理空值(NULL)的函数之一。它接受两个参数:要检查的表达式和默认值。如果表达式为NULL,则NVL()函数返回默认值;否则,它返回表达式的值。以下是NVL()函数的详细说明:函数签名:NVL(expr,default)参数:expr是要检查的表达式,default是在expr为NULL时返回的默认值......
  • Codeforces Round 809 (Div. 2)
    基本情况A题秒了。B题卡了很久,最后过了。C来不及了。B.MakingTowersProblem-B-Codeforces卡题分析最初想法其实已经推出来下标差为奇数才能构成高塔了。但是思维固化,认为这个问题就必须用LIS那类做法做,然后硬打了一个\(\operatornameO(n^2)\)的DP,然后就TLE......
  • 《Effective Java》阅读笔记-第五章
    EffectiveJava阅读笔记第五章泛型第26条不要使用原生类型随着泛型的普及,这条没什么可说的。如果不知道具体类型,可以使用<?>来代替。第27条消除unchecked警告原生类型到泛型转换时,编译会有警告,可以使用@SuppressWarnings("unchecked")来消除警告。并且应该在尽可......
  • Codeforces Round 808 (Div. 2)
    基本情况最难受的一集。A搞了一个半小时愣是没开出来。A.DifferenceOperationsProblem-A-Codeforces错误分析我分了好多类讨论,换言之没找到更本质的东西。我想的是如果前面有一个数能处理到\(1\)那后面就都能过。止步于此,而没有往更本质,更普适的地方想。然后又......
  • HarmonyOS:NativeWindow 开发指导
     场景介绍NativeWindow是HarmonyOS本地平台化窗口,表示图形队列的生产者端。开发者可以通过NativeWindow接口进行申请和提交Buffer,配置Buffer属性信息。针对NativeWindow,常见的开发场景如下:● 通过NativeWindow提供的Native API接口申请图形Buffer,并将生产图形内容写入图......
  • Codeforces Round 807 (Div. 2)
    基本情况AB题秒了。C题搞了半天,搞了一个假的解法,最后还是爆空间了。D题没想下去。C.MarkandHisUnfinishedEssayProblem-C-Codeforces错误分析写出来自己的错解之后没有进一步思考,而是觉得没希望直接做D去了,实则D也没可能半小时写完。我的错解就是预处理好每个......
  • Livepatch模块的ELF格式要求【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/livepatch/module-elf-format.htmlLivepatch模块的ELF格式要求本文档概述了livepatch模块必须遵循的ELF格式要求。1.背景和动机以前,livepatch需要特定于体系结构的代码来编写重定位。然而,模块加载器中已经存在特定于体系结构的代码来......