739. 每日温度 496.下一个更大元素 I

739. 每日温度

栈限定仅在表尾进行插入和删除操作的线性表,这一端被称为栈顶,相对地,把另一端称为栈底。
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是只需要遍历一次。
在使用单调栈的时候首先要明确如下几点:
1、单调栈里存放的元素是什么?
单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。
2、单调栈里元素是递增呢? 还是递减呢?
注意一下顺序为 从栈头到栈底的顺序,这里要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,加入一个元素i,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。
使用单调栈主要有三个判断条件。
当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:answers = [0] * len(temperatures)stack = [0]for i in range(1, len(temperatures)):if temperatures[i] <= temperatures[stack[-1]]:stack.append(i)else:while len(stack) and temperatures[i] > temperatures[stack[-1]]:answers[stack[-1]] = i-stack[-1]stack.pop()stack.append(i)return answers

496.下一个更大元素 I

从题目示例中可以看出最后是要求nums1的每个元素在nums2中下一个比当前元素大的元素,那么就要定义一个和nums1一样大小的数组result来存放结果。
题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。
在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。
本题和739. 每日温度是一样的。栈头到栈底的顺序,要从小到大,也就是保持栈里的元素为递增顺序。只要保持递增,才能找到右边第一个比自己大的元素。
接下来就要分析如下三种情况,一定要分析清楚。
情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
此时满足递增栈(栈头到栈底的顺序),所以直接入栈。
情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
如果相等的话,依然直接入栈,因为我们要求的是右边第一个比自己大的元素,而不是大于等于!
情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
此时如果入栈就不满足递增栈了,这也是找到右边第一个比自己大的元素的时候。
判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。
记录结果这块逻辑有一点小绕,要清楚,此时栈顶元素在nums2中右面第一个大的元素是nums2[i]即当前遍历元素。

class Solution:def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:result = [-1] * len(nums1)stack = [0]for i in range(1, len(nums2)):# 1  2if nums2[i] < nums2[stack[-1]]:stack.append(i)elif nums2[i] == nums2[stack[-1]]:stack.append(i)# 3else:while len(stack) != 0 and nums2[i] > nums2[stack[-1]]:if nums2[stack[-1]] in nums1:index = nums1.index(nums2[stack[-1]])result[index] = nums2[i]stack.pop()stack.append(i)return result

leetcode 打卡 day58相关推荐

  1. 11.9 leetcode打卡

    11.9 leetcode打卡 94.二叉树的中序遍历 原题链接:94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 . 输入:root = [1,null ...

  2. 力扣(LeetCode)打卡刷题交流计划(长期维护)

    前言 忙忙活活暑期过去了一半,在即将升学的日子里,打算干点什么东西,由于实力以及经验的欠缺没有创群和大家讨论,但我更喜欢以更实在的方式--能作点什么--和大家一起从0打开力扣LeetCode, 对,没 ...

  3. LeetCode打卡 52八皇后Ⅱ53最大子序和54螺旋矩阵

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

  4. 数据结构与算法之数组: Leetcode 914. 卡牌分组 (Typescript版)

    卡牌分组 https://leetcode.cn/problems/x-of-a-kind-in-a-deck-of-cards/ 描述 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 ...

  5. LeetCode打卡Day1

    DataWhale学习小组~ Leetcode腾讯精选练习50题 2-两数相加 4-寻找两个正序数组的中位数 5-最长回文子串 Leetcode腾讯精选练习50题 今天是打卡第一天!出师不利23333 ...

  6. LeetCode 914. 卡牌分组(最大公约数)

    1. 题目 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的整数. 仅当你可选的 ...

  7. LeetCode 914. 卡牌分组

    914. 卡牌分组 思路:统计个数,然后求最小公约数 class Solution { public:bool hasGroupsSizeX(vector<int>& deck) ...

  8. Leetcode打卡——二叉树的4种遍历你真的会了吗(Leetcode官解迭代法解法解析)

    哈喽大家,这里是小饼干,面向就业编程,持续更新学习路径,欢迎关注点赞鸭 这周开始刷二叉树了,一上来就是4种二叉树遍历,发现之前自己会了但没有完全会= =, 二叉树的遍历可以分为: (一)二叉树的深度优 ...

  9. LeetCode打卡:870.优势洗牌

    给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述. 返回 A 的任意排列,使其相对于 B 的优势最大化. 示例 1: 输入: ...

最新文章

  1. 时间序列基础教程总结!
  2. 计算机视觉工程师一天都大致在做些什么?
  3. 燕山大学计算机专业研究生怎么样,求助大家!重庆邮电大学计算机专业的研究生值得一读吗?...
  4. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
  5. 在Matlab2006a中如何创建.net组件
  6. 信息化基础建设 Reporting Services报表开发
  7. 完成3DM以后的总结(2).Xutils的简单使用
  8. 字段、数据库表-三大范式及存储方式-by小雨
  9. python中if brthon环境安装包_python-debian/test.deb.uu at master · romlok/python-debian · GitHub...
  10. yalmip简单的例子
  11. JavaCV调用摄像头
  12. MyEclipse10 破解方法
  13. JAVA设计模式之策略模式
  14. 面向面试题的前端学习-js篇(自用,持续完善中)
  15. FUTEX_SWAP补丁分析-SwitchTo 如何大幅度提升切换性能?
  16. 服务器部署sas_如何在阿里云SAS上部署WordPress网站
  17. timestamp(时间戳)详解
  18. ubuntu ufw(UncomplicatedFirewall)防火墙使用简介
  19. 使用Prolog编程语言解决爱因斯坦斑马难题
  20. 2021-2027全球与中国互联汽车技术市场现状及未来发展趋势

热门文章

  1. Verilog学习:常用模块——分频器的使用
  2. vs光标变成灰色方块的解决方法
  3. python编程大数据分析_大数据分析Python学习技巧
  4. KEIL在STM32下面如何仿真!
  5. 超级详细:一个漂亮的Vue分页器组件的实现
  6. 【历史上的今天】10 月 15 日:FORTRAN 语言正式问世;支付宝诞生第一笔交易;Tcl 语言发明者出生
  7. OC 与 Swift 区别
  8. 图论算法—图的拓扑排序介绍和Kahn算法原理解析以及Java代码的实现
  9. Poj 1094 拓扑排序Kahn
  10. html表格中如何设置thtd的边框颜色,表格Table 的Th Td 标签设置背景颜色后边框消失如何解决?...