day59 单调栈 每日温度 下一个更大元素Ⅰ 下一个更大元素Ⅱ

2024-04-20 23:52

本文主要是介绍day59 单调栈 每日温度 下一个更大元素Ⅰ 下一个更大元素Ⅱ,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目1:739 每日温度

题目链接:739 每日温度

题意

整数数组temperature表示每天的温度,返回数组answer使得answer[i]表示对于第i天,下一个更高温度出现在几天后,若没有,则用0代替

单调栈

第i个元素,和后面的元素逐个比较,返回第一个比该值大的元素距当前的位置

单调栈:找到右边/左边比该元素大/小的元素  记录之前遍历过的元素

题目求的距离,所以单调栈里面放的是元素的下标 

流程

伪代码

代码

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;vector<int> answer(temperatures.size(), 0);st.push(0);//存放第一个下标for(int i = 1; i < temperatures.size(); i++){if(!st.empty() && temperatures[i] <= temperatures[st.top()]){st.push(i);}else {while(!st.empty() && temperatures[i] > temperatures[st.top()]){answer[st.top()] = i - st.top();st.pop();}st.push(i);}}return answer;}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

题目2 :496 下一个更大元素Ⅰ

题目链接:496 下一个更大元素Ⅰ

题意

nums1和nums2是两个没有重复元素的数组,nums1是nums2的子集,找出nums1中的元素在nums2对应的下一个更大元素

暴力解法

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {       vector<int> result(nums1.size(), -1);for(int i = 0; i < nums1.size(); i++){for(int j = 0; j < nums2.size(); j++){if(nums1[i] == nums2[j]){// cout << i << " " << j << endl;for(int k = j + 1; k < nums2.size(); k++){if(nums2[k] > nums2[j]){result[i] = nums2[k];break;}}}}}return result;}
};
  • 时间复杂度:O(n^3)
  • 空间复杂度:O(n)

单调栈

将nums1中的元素和下标进行一个映射,便于在nums2中寻找

代码

class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {       vector<int> result(nums1.size(), -1);if(nums1.size() == 0) return result;//nums1的元素映射下标unordered_map<int, int> umap;for(int i = 0; i < nums1.size(); i++){umap[nums1[i]] = i;}stack<int> st;st.push(0);int index = 0;for(int i = 1; i < nums2.size(); i++){if(nums2[i] < nums2[st.top()]){st.push(i);}else{while(!st.empty() && nums2[i] > nums2[st.top()]){//判断nums2[st.top()]是否在nums1中if(umap.count(nums2[st.top()]) > 0){//获取下标index = umap[nums2[st.top()]];//更新结果集result[index] = nums2[i];}st.pop();}st.push(i);}} return result;}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

题目3:503 下一个更大元素Ⅱ

题目链接:503 下一个更大元素Ⅱ

题意

返回循环数组中每个元素的下一个更大元素,若不存在输出-1

在原数组基础上模拟成环  取模方式模拟转圈

代码

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> result(nums.size(), -1);stack<int> st;st.push(0);for(int i = 1; i < nums.size() * 2; i++){if(nums[i % nums.size()] <= nums[st.top()]){st.push(i % nums.size());}else{while(!st.empty() && nums[i % nums.size()] > nums[st.top()]){result[st.top()] = nums[i % nums.size()];st.pop();}st.push(i % nums.size());}}return result;}
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

这篇关于day59 单调栈 每日温度 下一个更大元素Ⅰ 下一个更大元素Ⅱ的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921664

相关文章

LeetCode--220 存在重复元素 III

题目 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。 示例 示例 1:输入: nums = [1,2,3,1], k = 3, t = 0输出: true示例 2:输入: nums = [1,0,1,1], k = 1, t = 2输出: true示例

LeetCode--217 存在重复元素

题目 给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true class Solution {p

每日一练:攻防世界:5-1 MulTzor

一、XorTool 基于 XOR(异或)运算实现。它可以帮助您快速地对文本、二进制文件进行加密解密操作。 认识XorTool工具: 让我们先去认识一下工具: xortool.py 是基于 python 的脚本,用于完成一些 xor 分析,包括: 猜想 key 的长度 猜想 key 的值 解密一些经过 xoe 加密的文件 也就是说当遇到不知道文件类型的文件,可以尝试去看看它是否被xo

第三十七章 添加和使用自定义标题元素 - 自定义标头的继承

文章目录 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承自定义标头的继承示例 在 `SOAPHEADERS` 参数中指定支持的标头元素自定义标头的继承 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承 自定义标头的继承 如果创建此Web 服务的子类,该子类将继承不特定于方法的标头信息 — 包含在 <request> 或 <response> 元素中的标头信

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

leetcode刷题(42)——703. 数据流中的第K大元素

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。 示例: int k = 3;int[] arr = [4,5,8,2];KthLargest kthLar

leetcode刷题(40)——83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 平时我们删除一个链表中的某个元素,一般都是以下的写法: temp.next = temp.next.next; 这样temp.next就被删除了 此题解法如下: class Solution

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目(leecode T538): 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 方法:本题

20240624 每日AI必读资讯

🤖AI学会篡改奖励函数、欺骗研究者!Claude团队:无法根除的行为,令人不安 - 实验中让AI可以访问自己的强化学习代码,并且提问:目前为止,我们总共进行了几轮强化学习?AI在自以为不会被看见的草稿纸中写下内心OS - 研究对未来如何避免强大的AI系统出现这种问题非常有意义。 - Anthropic、Readwood Research(专注AI安全的非盈利研究机构)和牛津大学合作研究

LeetCode 每日一题 2024/6/17-2024/6/23

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 6/17 522. 最长特殊序列 II6/18 2288. 价格减免6/19 2713. 矩阵中严格递增的单元格数6/20 2748. 美丽下标对的数目6/21 LCP 61. 气温变化趋势6/22 2663. 字典序最小的美丽字符串6/23 520. 检测大写字母 6/1