当前位置: 首页 > news >正文

LeetCode Hot100 刷题笔记(6)—— 栈、堆

目录

前言

一、栈

1. 有效的括号

2. 最小栈

3. 字符串解码

4. 每日温度

5. 柱状图中最大的矩形

二、堆

1. 数组中的第K个最大元素

2. 前K个高频元素

3. 数据流中的中位数


前言

一、栈:有效的括号,最小栈,字符串解码,每日温度,柱状图中最大的矩形。

二、堆:数组中的第K个最大元素,前K个高频元素,数据流中的中位数。


一、

1. 有效的括号

原题链接:20. 有效的括号 - 力扣(LeetCode)

class Solution(object):
    def isValid(self, s):
        dicts = {
            ')':'(',
            ']': '[',
            '}': '{'
        }
        stack = []
        for s_ in s:
            if stack and s_ in dicts:
                if stack[-1] == dicts[s_]: 
                    stack.pop()
                else:
                    return False
            else:
                stack.append(s_)
        return not stack

2. 最小栈

原题链接:155. 最小栈 - 力扣(LeetCode)

class MinStack(object):
    def __init__(self):
        self.lst = []

    def push(self, val):
        self.lst.append(val)

    def pop(self):
        self.lst.pop()

    def top(self):
        return self.lst[-1]

    def getMin(self):
        return min(self.lst)
        
# 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()

3. 字符串解码

原题链接:394. 字符串解码 - 力扣(LeetCode)

class Solution(object):
    def decodeString(self, s):
        stack = []
        res, dig = '', 0
        for s_ in s:
            if s_.isdigit():
                dig = dig*10 + int(s_)   # 处理300, 21等数字
            elif 'a'<=s_<='z':
                res = res + s_
            elif s_ == '[':
                stack.append((res, dig))
                res, dig = '', 0
            else:
                res_top, dig_top = stack.pop()
                res = res_top + res * dig_top   # [('', 3), ('a', 0)] --> res = 'a' --> res = ''+ 'a'*3 = 'aaa'
        return res

4. 每日温度

原题链接:739. 每日温度 - 力扣(LeetCode)

class Solution(object):
    def dailyTemperatures(self, temperatures):
        stack = []
        T = temperatures
        dicts = {i:0 for i in range(len(T))}

        for i in range(len(T)):
            while stack and T[stack[-1]] < T[i]:
                dicts[stack[-1]] = i - stack[-1]
                stack.pop()
            stack.append(i)
        return list(dicts.values())

5. 柱状图中最大的矩形

原题链接:84. 柱状图中最大的矩形 - 力扣(LeetCode)

class Solution(object):
    def largestRectangleArea(self, heights):
        stack = []
        heights = [0] + heights + [0]
        res = 0
        n = len(heights)
        for right in range(n):
            while stack and heights[right] < heights[stack[-1]]:
                left = stack.pop()
                h = heights[left]
                w = right-1-stack[-1]
                res = max(res, h*w)    # h递减,w递增
            stack.append(right)
        return res

二、

1. 数组中的第K个最大元素

原题链接:215. 数组中的第K个最大元素 - 力扣(LeetCode)

class Solution(object):
    def findKthLargest(self, nums, k):
        nums.sort()
        nums.reverse()
        return nums[k-1]

2. 前K个高频元素

原题链接:347. 前 K 个高频元素 - 力扣(LeetCode)

# 解法(1)
class Solution(object):
    def topKFrequent(self, nums, k):
        from collections import Counter
        lst = []
        for k, v in Counter(nums).most_common(k):
            lst.append(k)
        return lst

# 解法(2)
class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        snums = set(nums)
        dicts = {k:0 for k in snums}
        for n in nums:
            if n in dicts:
                dicts[n]+=1
        dicts_sort = sorted(dicts.items(), key=lambda x: x[1], reverse=True)
        lst = []
        for k,v in dicts_sort[:k]:
            lst.append(k)
        return lst

3. 数据流中的中位数

原题链接:295. 数据流的中位数 - 力扣(LeetCode)

class MedianFinder(object):
    def __init__(self):
        self.lst = [] 
    def addNum(self, num):
        self.lst.append(num)
    def findMedian(self):
        self.lst.sort()
        ln = len(self.lst)
        if ln % 2 == 0:
           mid = (self.lst[ln//2-1] + self.lst[ln//2]) / 2.0 
        else:
            mid = self.lst[ln//2]
        return mid

文章转载自:
http://caesarean.dxwdwl.cn
http://battalion.dxwdwl.cn
http://apathetically.dxwdwl.cn
http://brushland.dxwdwl.cn
http://bloodbath.dxwdwl.cn
http://arkhangelsk.dxwdwl.cn
http://capstone.dxwdwl.cn
http://catecholamine.dxwdwl.cn
http://bookstack.dxwdwl.cn
http://bornholm.dxwdwl.cn
http://catholicon.dxwdwl.cn
http://astringency.dxwdwl.cn
http://abandon.dxwdwl.cn
http://arginine.dxwdwl.cn
http://aplenty.dxwdwl.cn
http://ankle.dxwdwl.cn
http://cheers.dxwdwl.cn
http://boogeyman.dxwdwl.cn
http://bmw.dxwdwl.cn
http://bluffly.dxwdwl.cn
http://cesser.dxwdwl.cn
http://chiton.dxwdwl.cn
http://chiromancer.dxwdwl.cn
http://charpit.dxwdwl.cn
http://bifurcated.dxwdwl.cn
http://blowtorch.dxwdwl.cn
http://chamberer.dxwdwl.cn
http://atelectasis.dxwdwl.cn
http://castellany.dxwdwl.cn
http://bind.dxwdwl.cn
http://www.dtcms.com/a/107748.html

相关文章:

  • HTML表单
  • RabbitMQ技术方案分析
  • 【面试篇】JVM
  • 使用STM32CubeMX和Keil在STM32上创建并运行一个简单的FreeRTOS多任务程序
  • 前端面试常考算法题目详解
  • W3C XML Schema 活动
  • 物理备份工具Xtrabackup备份和恢复原理详解
  • GitHub 趋势日报 (2025年04月01日)
  • ★ Linux ★ 环境变量和程序地址空间
  • Servlet 点击计数器
  • PCL RANSAC探测多条空间直线(指定方向)
  • 对话Dify.AI延君晨:让AI应用开发像搭积木一样简单
  • 5年——我的创作纪念日
  • Knife4j文档请求异常 空指针
  • C++封装、继承、多态(虚函数)
  • CISCO ASA防火墙、 VPN基础内容、 IPSec VPN
  • MySQL学习集--sql通用语法和数据类型
  • 机器视觉中的传统视觉与深度视觉
  • 【3.软件工程】3.4 原型及相关模型
  • 2025年3月31日 GGG2
  • 笔记1——数据通信网络基础
  • Ogcloud东南亚SD-WAN专线:经济高效、快速稳定!
  • KingbaseES物理备份还原之备份还原
  • arcgis10.8 Toolbox中没有找到conversion tools模块
  • 工业4.0时代下的人工智能新发展
  • syslog 与 Linux 内核日志系统全面解析
  • 【kafka】Kafka的Topic
  • 实战打靶集锦-35-GitRoot
  • 软件定义无线电39
  • SpringMVC和SpringBoot是否线程安全?