首页 > 编程语言 >单调栈C++

单调栈C++

时间:2024-03-14 23:58:57浏览次数:30  
标签:nums top C++ st 单调 push nums2 size

一、每日温度

    1、题目:

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

    2、代码:

#include<vector>
#include<stack>
using namespace std;
class Solution {
public:
    vector<int>dailyTemperrature(vector<int>& t) {
        vector<int>result(t.size(), 0);
        stack<int>st;
        st.push(0);
        for (int i = 1; i < t.size(); i++) {
            if (t[i] < t[st.top()]) {
                st.push(i);
            }
            else if (t[i] == t[st.top()]) {
                st.push(i);
            }
            else {
                while (!st.empty() && t[i] > t[st.top()]) {
                    result[st.top()] = i - st.top();
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};

二、下一个更大元素(两个数组)

    1、题目:

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

    2、代码:

#include<vector>
#include<stack>
#include<algorithm>
#include<unordered_map>
using namespace std;
class solution {
public:
    vector<int>nextGreaterNum(vector<int>& nums1, vector<int>& nums2) {
        stack<int>st;
        st.push(0);
        unordered_map<int, int>map;
        vector<int>result(nums1.size(), -1);
        if (nums1.size() == 0) {
            return result;
        }
        for (int i = 0; i < nums1.size(); i++) {
            map[nums1[i]] = i;
        }
        for (int i = 1; i < nums2.size(); i++) {
            if (nums2[i] < nums2[st.top()]) {
                st.push(i);
            }
            else if (nums2[i] == nums2[st.top()]) {
                st.push(i);
            }
            else {
                while (!st.empty() && nums2[i] > nums2[st.top()]) {
                    if (map.count(nums2[st.top()]) > 0) {
                        int index = map[nums2[st.top()]];
                        result[index] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }

};

三、下一个更大元素(循环数组)

    1、题目:

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

    2、代码:

#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
class solution {
public:
    vector<int>nextGreaterNum(vector<int>& nums) {
        stack<int>st;
        st.push(0);
        vector<int>result(nums.size(), -1);
        if (nums.size() == 0) {
            return result;
        }
        for (int i = 1; i < nums.size()*2; i++) {
            if (nums[i]%nums.size() < nums[st.top()]) {
                st.push(i%nums.size());
            }
            else if (nums[i%nums.size()] == nums[st.top()]) {
                st.push(i%nums.size());
            }
            else {
                while (!st.empty() && nums[i] > nums[st.top()]) {
                    result[st.top()] = nums[i % nums.size()];
                    st.pop();
                }
                st.push(i%nums.size());
            }
        }
        return result;
    }

};

标签:nums,top,C++,st,单调,push,nums2,size
From: https://blog.csdn.net/2302_76979008/article/details/136725064

相关文章

  • C++模板的显式具体化
    C++模板C++没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。例如有下面的函数模板,它用来获取两个变量中较大的一个:template<class T> const T& ......
  • KTL 一个支持C++14编辑公式的K线技术工具平台 - 第九版,数据分析工具。支持通达信日线
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL国内仓库:https://gitee.com/bbqz007/KTL CoreAnimationforWindows: https://github.com/bbqz007/xwzqt5 一个超简单的Qt5窗口语法: https://gith......
  • (C++)二分
    二分​ 二分,他可以应用的范围特别广,即使是你想不到的地方他也可以二分。​ 例如:Acwing790数的三次方根这题可以直接二分题目所要求的答案,通过不断逼近三次方后的结果来二分;Acwing5407.管道,这题里可以直接二分时间,然后合并区间查看是否满足;Acwing730.机器人跳跃问题可以......
  • C++ | 蓝桥题库区间或(位运算)
    一开始看题解很晕,这里采用前缀和方式的思想是:按位贡献,将答案分成32份(1e9最多32位二进制数)这样才有的prefix[32][N]前缀和数组,求的是第i位数第w位上的和。(1<<w)1左移w位相当于2的w次方,prefix[w][r]-prefix[w][l-1]相当于[l,r]这段距离上有1就让ans加上1,没有就不加。#inc......
  • C++函数模板的实参推断
    C++模板在使用类模板创建对象时,程序员需要显式的指明实参(也就是具体的类型)。例如对于下面的Point类:template<typename T1, typename T2> class Point;我们可以在栈上创建对象,也可以在堆上创建对象:Point<int, int> p1(10, 20);  //在栈上创建对象Point<char*, c......
  • 归并排序、快速排序——左神数据结构与算法Day2学习笔记C++版本(持续更新)
    递归行为        利用递归求整个数组的最大值,代码如下。intfind_Max(inta[],intL,intR){if(L==R){returna[L];}intmid=L+((R-L)>>1);//mid是数组的中点intleftMax=find_Max(a,L,mid);intrightMax......
  • C++并发编程:线程池学习
    文章目录一、线程池的概念二、线程池的设计三、线程池的实现1、ThreadPool声明2、线程创建3、添加任务4、ThreadPool析构四、相关知识点1、emplace_back和push_back2、typenamestd::result_of<F(Args...)>::type3、std::packaged_task<return_type()>4、函数模板和......
  • C/C++ vscode 配置
    一、由于vscode本身不带有编译器,需要下载MinGW编译器 打开网站:MinGW-w64-for32and64bitWindows-Browse/mingw-w64/mingw-w64-releaseatSourceForge.net下载x86_64-win32-seh版本下载后,解压缩,把解压缩后的文件剪切奥C:\ProgramFiles把路径C:\ProgramFiles......
  • C++函数模板的重载
    C++模板当需要对不同的类型使用同一种算法(同一个函数体)时,为了避免定义多个功能重复的函数,可以使用模板。然而,并非所有的类型都使用同一种算法,有些特定的类型需要单独处理,为了满足这种需求,C++允许对函数模板进行重载,程序员可以像重载常规函数那样重载模板定义。我们定义了Swap(......
  • C++ error C2143: 语法错误: 缺少“;”(在“*”的前面)
    errorC2143编译错误但是,我在官网的例子上没有找到我所遇见的问题!在此记录一下,问题代码如下:1classtestA1;2classworkclass3{4public:5explicitworkclass();6virtual~workclass();7private:8intM_INT;9......