classSolution: defisValid(self, s: str) -> bool: iflen(s) % 2: # s 长度必须是偶数 returnFalse mp = {')': '(', ']': '[', '}': '{'} st = [] for c in s: if c notin mp: # c 是左括号 st.append(c) # 入栈 elifnot st or st.pop() != mp[c]: # c 是右括号 returnFalse# 没有左括号,或者左括号类型不对 returnnot st # 所有左括号必须匹配完毕
155.最小栈(中等)
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆栈顶部的元素。 int getMin() 获取堆栈中的最小元素。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
涉及知识点
栈
解决思路
利用栈来解决括号问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution: defdecodeString(self, s: str) -> str: stack, res, multi = [], "", 0 for c in s: if c == '[': stack.append([multi, res]) res, multi = "", 0 elif c == ']': cur_multi, last_res = stack.pop() res = last_res + cur_multi * res elif'0' <= c <= '9': multi = multi * 10 + int(c) else: res += c return res
classSolution: deflargestRectangleArea(self, heights: List[int]) -> int: n = len(heights) left = [-1] * n st = [] for i, x inenumerate(heights): while st and x <= heights[st[-1]]: st.pop() if st: left[i] = st[-1] st.append(i)
right = [n] * n st.clear() for i inrange(n - 1, -1, -1): x = heights[i] while st and x <= heights[st[-1]]: st.pop() if st: right[i] = st[-1] st.append(i)
ans = 0 for h, l, r inzip(heights, left, right): ans = max(ans, h * (r - l - 1)) return ans
215.数组中的第K个最大元素(中等)
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
涉及知识点
堆
解决思路
最小堆
1 2 3 4 5 6 7 8
classSolution: deffindKthLargest(self, nums: List[int], k: int) -> int: nums2=[-i for i in nums] heapq.heapify(nums2) for i inrange(k-1): heapq.heappop(nums2) return -heapq.heappop(nums2)
347.前K个高频元素(中等)
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
涉及知识点
堆
解决思路
最小堆
1 2 3 4 5 6
classSolution: deftopKFrequent(self, nums: List[int], k: int) -> List[int]: count=Counter(nums) heap=[(val,key) for key,val in count.items()] return [item[1] for item in heapq.nlargest(k,heap)]
classSolution: defmaxProfit(self, prices: List[int]) -> int: ans = 0 min_price = prices[0] for p in prices: ans = max(ans, p - min_price) min_price = min(min_price, p) return ans
classSolution: defpartitionLabels(self, s: str) -> List[int]: last = {c: i for i, c inenumerate(s)} # 每个字母最后出现的下标 ans = [] start = end = 0 for i, c inenumerate(s): end = max(end, last[c]) # 更新当前区间右端点的最大值 if end == i: # 当前区间合并完毕 ans.append(end - start + 1) # 区间长度加入答案 start = i + 1# 下一个区间的左端点 return ans