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

文章讲述了如何使用单调栈和哈希表优化算法解决LeetCode中的两个问题:计算每日温度差异和找到下一个更大元素。通过这两个例子,展示了如何在数据结构上下文中实现高效解题策略。
摘要由CSDN通过智能技术生成

739. 每日温度

https://leetcode.com/problems/daily-temperatures/

思路:本题是单调栈的一个经典应用, 单调栈是循环数组时, 不停的把元素推入栈中, 同时如果需要, 推出栈中的元素, 保持栈的单调性。 单调栈可以是递增或者递减的。递增栈中, 栈顶的元素是最小的 (先入后出) 例如数组 [5, 3,4,1] 单调递增栈中的元素 i = 0, st = [5], i=1 st=[5, 3], i = 2 st = [5, 4] (推出3)。 i = 3 st = [5, 4, 1]. 可以看到当我们为了加入一个元素而不得不推出一个元素时, 被推出的元素右边第一个大于它的元素就是将要被推入的元素。 而被推入栈之前, 栈顶的元素是左边第一个大于它的元素。 同理可用单调递减栈处理寻找左右小于当前元素的值的问题。

难点: 掌握单调栈的原理

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

496.下一个更大元素 I  

https://leetcode.com/problems/next-greater-element-i/description/

思路: 这个题想要做到O(nums1.length + nums2.length) 并不是一个简单的问题。要结合哈希表和 单调栈。 哈希表记录元素值 和元素在nums 1 的下标, 这样我们在用单调递增栈时, 当碰到元素在 hash table 中的时候, 找到了它右边最近的更大元素, 就可以在对应答案的下标中修改。

难点:结合

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        ans = [-1] * len(nums1)
        _tmp = {num: i  for i, num in enumerate(nums1)}

        st = deque()
        for j in range(len(nums2)):
            while st and st[-1] < nums2[j]:
                num = st.pop()
                if num in _tmp:
                    ans[_tmp[num]] = nums2[j]
            st.append(nums2[j])
        return ans
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二算法训练营主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值