这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
题1
最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) —— 将元素 x 推入栈中。
- pop() —— 删除栈顶的元素。
- top() —— 获取栈顶元素。
- getMin() —— 检索栈中的最小元素。
示例:
输入:
- ["MinStack","push","push","push","getMin","pop","top","getMin"]
- [[],[-2],[0],[-3],[],[],[],[]]
输出:
- [null,null,null,null,-3,null,0,-2]
解释:
- MinStack minStack = new MinStack();
- minStack.push(-2);
- minStack.push(0);
- minStack.push(-3);
- minStack.getMin(); --> 返回 -3.
- minStack.pop();
- minStack.top(); --> 返回 0.
- minStack.getMin(); --> 返回 -2.
提示:
- pop、top 和 getMin 操作总是在 非空栈 上调用。 相关标签
- 栈
- 设计
这里使用双栈解法
class MinStack:
def __init__(self):
self.stack = []
self.stack_new = []
def push(self, x: int) -> None:
self.stack.append(x)
if not self.stack_new or x <= self.stack_new[-1]:
self.stack_new.append(x)
def pop(self) -> None:
val = -1
if self.stack:
val = self.stack.pop()
if val == self.stack_new[-1]:
self.stack_new.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.stack_new[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
执行结果:
题2
数组中的第K个最大元素
- 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
- 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
- 输入: [3,2,1,5,6,4] 和 k = 2
- 输出: 5
示例2:
-
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
-
输出: 4 提示:
-
1 <= k <= nums.length <= 104
-
-104 <= nums[i] <= 104
相关标签
- 数组
- 分治
- 快速选择
- 排序
- 堆(优先队列)
简单想法 倒排然后取第k个值
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
nums.sort(reverse=True)
return nums[k-1]
明显我们现在学习的堆栈不太适用上面的方法
还是用堆的思想来学习一下 这里学习一下小顶堆的方法进行开发
from heapq import *
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
res = []
for row in range(len(nums)):
heappush(res,nums[row])
if row >= k: heappop(res)
return res[0]
执行结果: