当前位置: 首页 > news >正文

leetcode496. 下一个更大元素 I 【单调栈】

【简单题】(暴力遍历法很简单)但是时间复杂度很高,n的立方级别了。。。

代码:

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {vector<int> ans;	// 存放结果for (int i = 0; i < nums1.size(); i++) {int t = nums1[i];	// 暂存要查找的值for (int j = 0; j < nums2.size(); j++) {	// 在nums2中找与t相等的值if (nums2[j] == t) {	// 如果找到相等的值,就往后找第一个比他大的int k;for (k = j + 1; k < nums2.size(); k++) {if (nums2[k] > t) {	// 找到第一个比它大的元素,压入该元素入栈ans.push_back(nums2[k]);break;}}if (k == nums2.size()) {	// 遍历完nums2数组,没有找到比它大的元素。压入 -1 入栈ans.push_back(-1);}}}}return ans;}
};

运行结果:

 

进阶方法:

进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

答案思路:【单调栈】

怎么样才能使得 用 nums1中的元素去 nums2中查找的时候,能够很快的不用遍历就可以查到第一个比它大的元素呢?

先预处理 num2,使得对于他的每个元素,用一个哈希表来存储第一个比他大的元素的映射。

步骤(参考leetcode官方题解)

遍历完之后 hashmap 中存储的键值对如下所示:

 

自己的话总结:

从后往前遍历(当前值为t),如果栈中的值比 t 小,则出栈到没有比它小 或 栈空位置。然后设置哈希映射,键为 t,值为 栈顶元素。然后将该元素入栈。直到遍历完第一个元素。

这样,对于 nums2中的每一个元素,在hashmap中都存储了 第一个比他大的元素 的映射。

注意:

使用 unordered_map 时,要引入库文件:#include <unordered_map>

代码:

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {unordered_map<int, int> mp;	// 设置哈希表stack<int> st;	 // 栈for (int i = nums2.size() - 1; i >= 0; i--) {	// 从后往前遍历 nums2int t = nums2[i];while (!st.empty() && t > st.top())		// 如果栈非空的条件下,当前值 > 栈顶元素,就出栈st.pop();if (st.empty()) {	// 如果栈为空,说明在该数组中,该元素没有第一个比它大的元素,设置它的映射值为 -1mp[t] = -1;}else {mp[t] = st.top();	// 如果栈非空,那么该元素的哈希映射值为 栈顶元素。}st.push(t);	}vector<int> ans;for (int i = 0; i < nums1.size(); i++) {ans.push_back(mp[nums1[i]]);}return ans;}
};

 

http://www.lryc.cn/news/140221.html

相关文章:

  • Fastadmin框架 聚合数字生活抵扣卡系统v2.8.6
  • windows下MSYS、MinGW编译环境使用网络API时报错:undefined reference to `inet_pton‘解决办法
  • unity-AI自动导航
  • 使用create-react-app创建react项目
  • 12.串,串的存储结构与模式匹配算法
  • Ribbon:listOfServers ,${variableName:defaultValue}
  • TensorFlow二元-多类-多标签分类示例
  • 【回眸】牛客网刷刷刷!(七)——通信协议之 网络通讯
  • MySQL 安装配置
  • 【0824作业】C++ 拷贝赋值函数、匿名对象、友元、常成员函数和常对象、运算符重载
  • ubuntu 22.04 LTS openai triton 安装
  • Android SDK 上手指南||第七章 Java应用程序编程
  • Vue 框架如何获取数组中的值?
  • 如何成立一家音频芯片/算法设计公司
  • 用docker-compose搭建LNMP
  • JavaScript:基本语法(变量与函数的定义与使用)
  • 树莓派4B上安装Gitlab
  • JVM 之字节码(.class)文件
  • neo4j函数
  • wazuh初探系列一 : wazuh环境配置
  • 【2023】Spring Validation中@NotNull注解、@NotBlank注解介绍以及使用
  • nodejs+vue养老院管理系统 u1yrv
  • 高效PDF校对:释放高质量内容的力量
  • 【Git游戏】提交的技巧
  • SQL注入读写文件
  • stm32之12.如何使用printf打印输出
  • 敏感挂载hotplug容器逃逸分析与复现
  • RTThread学习有关的Keil的两个符号 $Sub$ $main 与 $Super$ $main
  • Python实现企业微信群告警
  • python基础教程:re模块用法详解