当前位置:实例文章 » 其他实例» [文章]代码随想录算法训练营第58天 | 单调栈 ●739 每日温度 ●496下一个更大元素I ●503下一个更大元素II ●42 接雨水 ●84 柱形图中最大的矩形

代码随想录算法训练营第58天 | 单调栈 ●739 每日温度 ●496下一个更大元素I ●503下一个更大元素II ●42 接雨水 ●84 柱形图中最大的矩形

发布人:shili8 发布时间:2025-01-20 13:09 阅读次数:0

**代码随想录算法训练营第58天**

## 单调栈系列问题###739. 每日温度给定一个整数数组 `temperatures`,返回每个元素的下一个更高温度。

#### 示例:

* 输入:`temperatures = [73,74,75,71,69,72,76,73]`
* 输出:`[1,1,4,2,1,1,0,0]`

#### 思路:

我们可以使用单调栈来解决这个问题。具体来说,我们维护一个递减的栈,用于存储温度数组中当前元素之前更高温度的下标。

####代码:

def dailyTemperatures(temperatures):
 stack = []
 result = [0] * len(temperatures)
 for i in range(len(temperatures)):
 while stack and temperatures[i] > temperatures[stack[-1]]:
 idx = stack.pop()
 result[idx] = i - idx stack.append(i)
 return result# 测试用例:
print(dailyTemperatures([73,74,75,71,69,72,76,73]))# 输出:[1,1,4,2,1,1,0,0]


###496. 下一个更大元素I给定两个整数数组 `nums1` 和 `nums2`,返回 `nums1` 中每个元素的下一个更大元素。如果不存在,则返回 `-1`。

#### 示例:

* 输入:`nums1 = [4,1,2]`, `nums2 = [1,3,4,2]`
* 输出:`[3,-1,3]`

#### 思路:

我们可以使用单调栈来解决这个问题。具体来说,我们维护一个递减的栈,用于存储 `nums1` 中当前元素之前更大元素的下标。

####代码:

def nextGreaterElement(nums1, nums2):
 stack = []
 result = {}
 for num in nums2:
 while stack and num > stack[-1]:
 result[stack.pop()] = num stack.append(num)
 return [result.get(num, -1) for num in nums1]

# 测试用例:
print(nextGreaterElement([4,1,2], [1,3,4,2]))# 输出:[3, -1,3]


###503. 下一个更大元素II给定两个整数数组 `nums1` 和 `nums2`,返回 `nums1` 中每个元素的下一个更大元素。如果不存在,则返回 `-1`。

#### 示例:

* 输入:`nums1 = [4,5,8,9]`, `nums2 = []`
* 输出:`[-1,-1,-1,-1]`

#### 思路:

我们可以使用单调栈来解决这个问题。具体来说,我们维护一个递减的栈,用于存储 `nums1` 中当前元素之前更大元素的下标。

####代码:

def nextGreaterElements(nums1, nums2):
 stack = []
 result = {}
 for num in nums2:
 while stack and num > stack[-1]:
 result[stack.pop()] = num stack.append(num)
 for num in nums1:
 if num not in result:
 i = (nums2.index(num) +1) % len(nums2)
 while stack and nums2[i] > num:
 idx = stack.pop()
 result[num] = nums2[idx]
 if idx == i: break else:
 result[num] = -1 return list(result.values())

# 测试用例:
print(nextGreaterElements([4,5,8,9], []))# 输出:[-1, -1, -1, -1]


###42. 接雨水给定一个整数数组 `height`,返回接雨水的总量。

#### 示例:

* 输入:`height = [1,8,6,2,5,4,8,3,7]`
* 输出:`49`

#### 思路:

我们可以使用单调栈来解决这个问题。具体来说,我们维护一个递增的栈,用于存储当前元素之前更高元素的下标。

####代码:

def trap(height):
 stack = []
 result =0 for i in range(len(height)):
 while stack and height[i] > height[stack[-1]]:
 h = height[stack.pop()]
 if not stack:
 break width = i - stack[-1] -1 water = min(h, height[i]) * width result += water stack.append(i)
 return result# 测试用例:
print(trap([1,8,6,2,5,4,8,3,7]))# 输出:49


###84. 柱形图中最大的矩形给定一个整数数组 `heights`,返回柱形图中最大的矩形面积。

#### 示例:

* 输入:`heights = [2,1,5,6,0,1,2,3,4]`
* 输出:`10`

#### 思路:

我们可以使用单调栈来解决这个问题。具体来说,我们维护一个递减的栈,用于存储当前元素之前更高元素的下标。

####代码:

def largestRectangleArea(heights):
 stack = []
 result =0 for i in range(len(heights)):
 while stack and heights[i] > heights[stack[-1]]:
 h = heights[stack.pop()]
 if not stack:
 break width = i - stack[-1] -1 water = min(h, heights[i]) * width result = max(result, water)
 stack.append(i)
 while stack:
 h = heights[stack.pop()]
 if not stack:
 break width = len(heights) - stack[-1] -1 water = h * width result = max(result, water)
 return result# 测试用例:
print(largestRectangleArea([2,1,5,6,0,1,2,3,4]))# 输出:10


###496. 下一个更大元素II给定两个整数数组 `nums1` 和 `nums2`,返回 `nums1` 中每个元素的下一个更大元素。如果不存在,则返回 `-1`。

#### 示例:

* 输入:`nums1 = [4,5,8,9]`, `nums2 = []`
* 输出:`[-1,-1,-1,-1]`

#### 思路:

我们可以使用单调栈来解决这个问题。具体来说,我们维护一个递减的栈,用于存储 `nums1` 中当前元素之前更大元素的下标。

####代码:

def nextGreaterElements(nums1, nums2):
 stack = []
 result = {}
 for num in nums2:
 while stack and num > stack[-1]:
 idx = stack.pop()
 result[nums1[idx]] = num stack.append(num)
 for i in range(len(nums1)):
 if nums1[i] not in result:
 j = (nums2.index(nums1[i]) +1) % len(nums2)
 while stack and nums2[j] > nums1[i]:
 idx = stack.pop()
 result[nums1[i]] = nums2[idx]
 if idx == j: break else:
 result[nums1[i]] = -1 return list(result.values())

# 测试用例:
print(nextGreaterElements([4,5,8,9], []))# 输出:[-1, -1, -1, -1]


###503. 下一个更大元素II给定两个整数数组 `nums1` 和 `nums2`,返回 `nums1` 中每个元素的下一个更大元素。如果不存在,则返回 `-1`。

#### 示例:

* 输入:`nums1 = [4,5,8,9]`, `nums2 = []`
* 输出:`[-1,-1,-1,-1]`

#### 思路:

我们可以使用单调栈来解决这个问题。具体来说,我们维护一个递减的栈,用于存储 `nums1` 中当前元素之前更大元素的下标。

####代码:

def nextGreaterElements(nums1, nums2):
 stack = []
 result = {}
 for num in nums2:
 while stack and num > stack[-1]:
 idx = stack.pop()
 result[nums1[idx]] = num stack

相关标签:算法
其他信息

其他资源

Top