本文共 6121 字,大约阅读时间需要 20 分钟。
栈是先进后出的数据结构,而队列是先进先出的。我们需要使用队列来实现栈的常见操作:push、pop、top和empty。以下是具体的操作定义:
为了实现栈的功能,我们可以利用两个队列来模拟栈的行为。具体来说,我们可以将一个队列用作入栈栈,另一个队列用作出栈栈。通过适当的逻辑操作,可以模拟栈的先进后出特性。
class MyStack: def __init__(self): self.q1 = collections.deque() self.q2 = collections.deque() def push(self, x): if self.q1.empty(): self.q2.append(x) else: self.q1.append(x) def pop(self): if self.q1.empty(): if not self.q2.empty(): while len(self.q2) > 1: self.q1.append(self.q2.popleft()) return self.q2.popleft() else: while not self.q2.empty() or not self.q1.empty(): if self.q1.empty(): self.q2.append(self.q1.popleft()) else: return self.q1.popleft() def top(self): if self.q1.empty(): if self.q2.empty(): return 0 else: return self.q2[-1] else: return self.q1[-1] def empty(self): return self.q1.empty() and self.q2.empty()
通过这种方法,我们可以使用队列来实现栈的基本操作,保持了先进后出的特性。
队列是先进先出的数据结构,而栈是先进后出的。我们需要使用栈来实现队列的常见操作:push、pop、peek和empty。以下是具体的操作定义:
为了实现队列的功能,我们可以利用两个栈来模拟队列的行为。具体来说,我们可以将一个栈用作出队栈,另一个栈用作入队栈。通过适当的逻辑操作,可以模拟队列的先进先出特性。
class MyQueue: def __init__(self): self.in_stack = collections.deque() self.out_stack = collections.deque() def push(self, x): self.in_stack.append(x) def pop(self): if not self.out_stack: while self.in_stack: self.out_stack.append(self.in_stack.popleft()) return self.out_stack.popleft() def peek(self): if not self.out_stack: while self.in_stack: self.out_stack.append(self.in_stack.popleft()) return self.out_stack[0] def empty(self): return not self.in_stack and not self.out_stack
通过这种方法,我们可以使用栈来实现队列的基本操作,保持了先进先出的特性。
我们需要设计一个支持push、pop、top和getMin操作的栈,且在常数时间内能够检索到栈中的最小元素。以下是具体的操作定义:
为了实现这个栈,我们可以使用两个栈来存储元素。一个栈用于正常的栈操作,另一个栈用于存储当前栈中最小元素。每当push操作执行时,我们需要检查当前栈是否为空以及最小栈是否为空,以决定如何更新栈的状态。
class MinStack: def __init__(self): self.normal = collections.deque() self.min = collections.deque() def push(self, x): self.normal.append(x) if not self.min: self.min.append(x) else: if x < self.min[-1]: self.min.append(x) else: self.min.append(self.min[-1]) def pop(self): if self.normal: self.normal.pop() if self.min and self.min[-1] == self.normal.pop(): self.min.pop() def top(self): return self.normal[-1] if self.normal else 0 def getMin(self): return self.min[-1] if self.min else 0
通过这种方法,我们可以在常数时间内检索到栈中的最小元素,同时支持栈的基本操作。
在未排序的数组中找到第k大的元素。请注意,我们需要找的是数组排序后的第k大的元素,而不是第k个不同的元素。
我们可以使用一个小顶堆来实现这个算法。小顶堆有一个特性是,堆顶是最小的元素。我们可以通过以下步骤来实现:
import heapqclass Solution: def findKthLargest(self, nums, k): heap = [] for num in nums: if len(heap) < k: heapq.heappush(heap, num) else: if num > heap[0]: heapq.heappop(heap) heapq.heappush(heap, num) return heap[0]
通过这种方法,我们可以在O(n log n)的时间复杂度内找到数组中的第k大的元素。
中位数是有序列表中间的数。如果列表长度是偶数,中位数是中间两个数的平均值。我们需要设计一个数据结构,支持以下操作:
我们可以使用两个堆来实现这个数据结构:一个小顶堆和一个大顶堆。小顶堆用于存储较小的一半元素,大顶堆用于存储较大的一半元素。通过维护这两个堆的大小关系,可以实现中位数的计算。
具体步骤如下:
import heapqclass MedianFinder: def __init__(self): self.small = [] self.big = [] def addNum(self, num): if not self.big: heapq.heappush(self.big, num) else: if num > self.big[0]: heapq.heappush(self.big, num) else: heapq.heappush(self.small, num) if len(self.small) > len(self.big): val = self.small.pop() heapq.heappush(self.big, val) def findMedian(self): if len(self.big) > len(self.small): return self.big[0] else: return (self.small[0] + self.big[0]) / 2.0
通过这种方法,我们可以在O(log n)的时间复杂度内进行addNum和findMedian操作,实现中位数的计算。
转载地址:http://vyfq.baihongyu.com/