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

LeetCode Hot100 刷题笔记(2)—— 子串、普通数组、矩阵

目录

前言

一、子串

1. 和为 K 的子数组

2. 滑动窗口最大值

3. 最小覆盖子串

二、普通数组

4. 最大子数组和

5. 合并区间

6. 轮转数组

7. 除自身以外数组的乘积

8. 缺失的第一个正数

三、矩阵

9. 矩阵置零

10. 螺旋矩阵

11. 旋转图像

12. 搜索二维矩阵 II


前言

一、子串:和为 K 的子数组,滑动窗口最大值,最小覆盖子串;(日更中.....)

二、普通数组:最大子数组和,合并区间,轮转数组,除自身以外数组的乘积,缺失的第一个正数;

三、矩阵:矩阵置零;螺旋矩阵;旋转图像;搜索二维矩阵 II。


一、子串

1. 和为 K 的子数组

原题链接:560. 和为 K 的子数组 - 力扣(LeetCode)

class Solution(object):
    def subarraySum(self, nums, k):
        dicts = {0: 1}
        n = len(nums)
        sums = 0
        res = 0
        for i in range(n):
            sums +=nums[i]
            res += dicts.get(sums-k, 0)
            dicts[sums] = dicts.get(sums, 0) + 1
        return res

2. 滑动窗口最大值

原题链接:239. 滑动窗口最大值 - 力扣(LeetCode)

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        q = []
        res = []
        for i in range(len(nums)):
            # 1. 入栈
            while q and nums[q[-1]] <= nums[i]:
                q.pop()
            q.append(i)
            # 2.出栈
            while i - q[0] >= k:
                q.pop(0)
            # 3.记录结果
            if i + 1 >= k:
                res.append(nums[q[0]])
        return res

3. 最小覆盖子串

原题链接:76. 最小覆盖子串 - 力扣(LeetCode)

# 考点:滑窗(不定窗口),快慢指针 --> 对比滑动窗口题型第2题
class Solution(object):
    def minWindow(self, s, t):
        from collections import Counter
        cnt_t = Counter(t)
        cnt_s = Counter()
        for key in cnt_t:
            if key not in cnt_s:
                cnt_s[key] = 0
        def is_exist(cnt_s, cnt_t):
            for key in cnt_t:
                if cnt_s[key] < cnt_t[key]:
                    return False
            return True

        res = ""
        left = 0
        min_len = float("inf")
        for right in range(len(s)):
            if s[right] in cnt_s:
                cnt_s[s[right]] += 1
            while is_exist(cnt_s, cnt_t):
                if right - left + 1 < min_len:
                    min_len =  right - left + 1
                    res = s[left: right+1]
                if s[left] in cnt_s:
                    cnt_s[s[left]] -= 1
                left += 1
        return res

二、普通数组

4. 最大子数组和

原题链接:53. 最大子数组和 - 力扣(LeetCode)

class Solution(object):
    def maxSubArray(self, nums):
        for i in range(1, len(nums)):
            nums[i] = max(nums[i-1]+nums[i], nums[i])  # 动态规划
        return max(nums)

5. 合并区间

原题链接:56. 合并区间 - 力扣(LeetCode)

class Solution(object):
    def merge(self, intervals):
        intervals = sorted(intervals, key = lambda x: x[0])
        merge = []
        for interval in intervals:
            if not merge or merge[-1][1] < interval[0]:
                merge.append(interval)
            else:
                merge[-1][1] = max(merge[-1][1], interval[1])
        return merge

6. 轮转数组

原题链接:189. 轮转数组 - 力扣(LeetCode)

class Solution(object):
    def rotate(self, nums, k):
        k = k % len(nums)
        nums[:] = nums[-k:] + nums[:-k]

7. 除自身以外数组的乘积

原题链接:238. 除自身以外数组的乘积 - 力扣(LeetCode)

class Solution(object):
    def productExceptSelf(self, nums):
        n = len(nums)
        answer = [1] * n
        
        # 前缀积
        prefix = 1
        for i in range(n):
            answer[i] *= prefix
            prefix *= nums[i]
        # 后缀积
        suffix = 1
        for i in range(n-1, -1, -1):
            answer[i] *= suffix
            suffix *= nums[i]
        return answer

8. 缺失的第一个正数

原题链接:41. 缺失的第一个正数 - 力扣(LeetCode)

class Solution(object):
    def firstMissingPositive(self, nums):
        # dicts处改成list会内存溢出
        dicts = {i:0 for i in nums}
        for i in range(1, len(nums)+1):
            if i not in dicts:
                return i
        return len(nums)+1

三、矩阵

9. 矩阵置零

原题链接:73. 矩阵置零 - 力扣(LeetCode)

class Solution(object):
    def setZeroes(self, matrix):
        setx, sety = set(), set()
        m, n = len(matrix), len(matrix[0])
        for i in range(m):
            for j in range(n):
                if matrix[i][j] == 0:
                    setx.add(i)
                    sety.add(j)
        
        for i in range(m):
            for j in range(n):
                if i in setx or j in sety:
                    matrix[i][j] = 0

10. 螺旋矩阵

原题链接:54. 螺旋矩阵 - 力扣(LeetCode)

class Solution(object):
    def spiralOrder(self, matrix):
        res = []
        while matrix:
            res += matrix.pop(0)
            matrix = list(zip(*matrix))[::-1]
        return res

11. 旋转图像

原题链接:48. 旋转图像 - 力扣(LeetCode)

class Solution(object):
    def rotate(self, matrix):
        matrix[:] = matrix[::-1]
        matrix[:] = list(zip(*matrix))

12. 搜索二维矩阵 II

原题链接:240. 搜索二维矩阵 II - 力扣(LeetCode)

class Solution(object):
    def searchMatrix(self, matrix, target):
        matrix = sum(matrix, [])
        for m in matrix:
            if m == target:
                return True
        return False
http://www.dtcms.com/a/122361.html

相关文章:

  • Ubuntu22.04——YOLOv8模型训练到RK3588设备部署和推理
  • 实现抗隐私泄漏的AI人工智能推理
  • Linux进程控制:fork、exit与waitpid的江湖恩怨
  • C# 根据指定路径、文件格式、创建日期清理文件夹内文件,包括子目录
  • 从Transformer到世界模型:AGI核心架构演进
  • 微信小程序 -- 原生封装table
  • UV安装与使用
  • asp.net core 项目发布到 IIS 服务器
  • 场外期权只适合上涨行情吗?
  • CSS语言的游戏AI
  • ResNet改进(18):添加 CPCA通道先验卷积注意力机制
  • 从个人博客到电商中台:EdgeOne Pages的MCP Server弹性架构×DeepSeek多场景模板实战解析
  • 1.VTK 使用CMakeLists
  • Linux 编程中的 I/O 复用
  • Element UI 设置 el-table-column 宽度 width 为百分比无效
  • React九案例中
  • 敏捷迭代实战经验分享
  • leetcode_数组 189. 轮转数组
  • Odrive0.5.1-FOC电机控制 arm_cos_f32.cpp arm_sin_f32.cpp代码实现(一)
  • 中科岩创基坑自动化监测解决方案
  • 【11】数据结构之基于线性表的查找算法
  • 【消息队列kafka_中间件】一、快速入门分布式消息队列
  • Android 中Intent 相关问题
  • STM32CubeMX-H7-12-IIC读写MPU6050模块(中)-MPU6050模块详解以及软件IIC驱动
  • Node.js是js语言在服务器编译运行的环境,什么是IP和域名
  • Python包管理工具uv简单使用
  • nginx或tengine服务器,配置HTTPS下使用WebSocket的线上环境实践!
  • 【详细】MySQL 8 安装解压即用 (包含MySQL 5 卸载)
  • Python从入门到精通全套视频教程免费
  • UniApp基于xe-upload实现文件上传组件