496. 下一个更大元素 I、739. 每日温度、503. 下一个更大元素 II、556. 下一个更大元素 III

496. 下一个更大元素 I

思路1:栈+字典存储(正向遍历)
先对 nums2 中的每一个元素,求出其下一个更大的元素。并将这些答案放入哈希表中,再遍历数组 nums1,直接找出对应的答案。

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        stack = [] 
        hash_table = {}
        for num in nums2:
            while stack and num>stack[-1]: # 寻找当前元素可以作为前面哪个元素的更大元素
                hash_table[stack.pop()] = num
            stack.append(num)
        return [hash_table.get(num,-1) for num in nums1]

在这里插入图片描述
思路2:反向遍历

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        stack = []  
        hash_table = {}
        for num in nums2[::-1]:
            while stack and num>=stack[-1]: # 栈中比当前元素小的全部弹出
                stack.pop()
            hash_table[num]= stack[-1] if stack else -1 # 栈不空时存着比当前元素更大的元素
            stack.append(num)
        return [hash_table.get(num,-1) for num in nums1]

在这里插入图片描述

739. 每日温度-实际是求下一个更大元素和现在索引的差值

区别在于栈里面存放索引差值

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

在这里插入图片描述

503. 下一个更大元素 II

思路1:直接把原数组翻倍,输出时只要前半部分答案。

class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        nums.extend(nums) # 输入翻倍
        n = len(nums)
        ans = [-1]*n
        stack = []
        for i in range(n-1,-1,-1):
            while stack and nums[i]>=stack[-1]:
                stack.pop(-1)
            if stack: ans[i] = stack[-1]
            stack.append(nums[i])
        return ans[:n//2]  # 输出前部分

在这里插入图片描述
优化:通过虚拟的输入翻倍来减少空间,主要是对索引进行求余,相当于在同样的数据上运行了两遍。

class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        n = len(nums)
        ans = [-1]*n
        stack = []
        for index in range(2*n-1,-1,-1):  # 改动
            i = index%n  # 改动 实现循环,相当于在同样的数据上运行了两遍
            while stack and nums[i]>=stack[-1]:
                stack.pop(-1)
            if stack: ans[i] = stack[-1]
            stack.append(nums[i])
        return ans

在这里插入图片描述

556. 下一个更大元素 III

参考:31. 下一个排列

发布了135 篇原创文章 · 获赞 5 · 访问量 7093

猜你喜欢

转载自blog.csdn.net/qq_27921205/article/details/104361463