代码随想录算法训练营第五十七天|739. 每日温度、496.下一个更大元素 I

LeetCode 739. 每日温度
题目链接:739. 每日温度 - 力扣(LeetCode)代码随想录算法训练营第五十七天|739. 每日温度、496.下一个更大元素 I_第1张图片

单调栈开始,为什么要用栈,因为栈是先入后出,当我们遍历从前往后的时候,每次遍历的元素都是添加至栈尾,方便我们进行比较,满足条件计算下标差值(因为是求几天后比今天热),不满足就继续走。

代码:

#python  //数组中每一位表示之后比今天温度高的天数距离
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        res = [0 for _ in range(len(temperatures))]   //每个的长度
        stack = []   //初始化一个空栈
        for i in range(len(temperatures)):
            while len(stack) > 0 and temperatures[i] > temperatures[stack[-1]]:  #如果大,就继续,如果小,啥都不操作,继续stack.append

                res[stack[-1]] = i - stack[-1]   #stack[-1]是满足条件的下标,i - stack[-1]是距离
                stack.pop()  #用完了丢掉
            stack.append(i)  #第一步,要把当前的下标放入栈中
        return res

LeetCode 496.下一个更大元素 I
题目链接:496. 下一个更大元素 I - 力扣(LeetCode)代码随想录算法训练营第五十七天|739. 每日温度、496.下一个更大元素 I_第2张图片

代码随想录算法训练营第五十七天|739. 每日温度、496.下一个更大元素 I_第3张图片先看是示例,题目意思是nums1中每个元素存在与nums2,对nums1中每个元素在nums2中对应位置之后进行判别,找到更大的元素,同样和上一题一样涉及到了位置距离的判别,因此同样使用单调栈。

代码:

#python
class Solution:  
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:  
        stack = []  
        nums2_next_greater = {}  # 用于存储nums2中每个元素的下一个更大的元素  
          
        # 首先,找出nums2中每个元素的下一个更大的元素  
        for num in nums2:  
            while stack and num > stack[-1]:  
                nums2_next_greater[stack.pop()] = num  
            stack.append(num)  
          
        # 处理栈中剩余的元素,它们没有下一个更大的元素  
        while stack:    
            nums2_next_greater[stack.pop()] = -1  
          
        # 对于nums1中的每个元素,查找其在nums2中的下一个更大的元素  
        res = [nums2_next_greater.get(num, -1) for num in nums1]  
        return res

你可能感兴趣的:(算法)