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

目录

前言

一、子串

[1. 和为 K 的子数组](#1. 和为 K 的子数组)

[2. 滑动窗口最大值](#2. 滑动窗口最大值)

[3. 最小覆盖子串](#3. 最小覆盖子串)

二、普通数组

[4. 最大子数组和](#4. 最大子数组和)

[5. 合并区间](#5. 合并区间)

[6. 轮转数组](#6. 轮转数组)

[7. 除自身以外数组的乘积](#7. 除自身以外数组的乘积)

[8. 缺失的第一个正数](#8. 缺失的第一个正数)

三、矩阵

[9. 矩阵置零](#9. 矩阵置零)

[10. 螺旋矩阵](#10. 螺旋矩阵)

[11. 旋转图像](#11. 旋转图像)

[12. 搜索二维矩阵 II](#12. 搜索二维矩阵 II)


前言

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

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

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


一、子串

1. 和为 K 的子数组

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

python 复制代码
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)

python 复制代码
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)

python 复制代码
# 考点:滑窗(不定窗口),快慢指针 --> 对比滑动窗口题型第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)

python 复制代码
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)

python 复制代码
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)

python 复制代码
class Solution(object):
    def rotate(self, nums, k):
        k = k % len(nums)
        nums[:] = nums[-k:] + nums[:-k]

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

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

python 复制代码
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)

python 复制代码
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)

python 复制代码
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)

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

11. 旋转图像

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

python 复制代码
class Solution(object):
    def rotate(self, matrix):
        matrix[:] = matrix[::-1]
        matrix[:] = list(zip(*matrix))

12. 搜索二维矩阵 II

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

python 复制代码
class Solution(object):
    def searchMatrix(self, matrix, target):
        matrix = sum(matrix, [])
        for m in matrix:
            if m == target:
                return True
        return False
相关推荐
zhaoyqcsdn18 分钟前
Eigen库的core模块源码阅读笔记
人工智能·经验分享·笔记·算法
Lounger6636 分钟前
107.二叉树的层序遍历II- 力扣(LeetCode)
python·算法·leetcode
竹下为生40 分钟前
LeetCode --- 444 周赛
算法·leetcode·职场和发展
美味的大香蕉1 小时前
Spark Core编程
笔记
liangmou21211 小时前
HTML5的笔记
前端·笔记·html·html5
2401_884810741 小时前
SpringBoot3快速入门笔记
笔记
A林玖2 小时前
【学习笔记】服务器上使用 nbconvert 将 Jupyter Notebook 转换为 PDF
服务器·笔记·学习
freyazzr2 小时前
Leedcode刷题 | Day30_贪心算法04
数据结构·c++·算法·leetcode·贪心算法
remember_me.2 小时前
基于李永乐线性代数基础的行列式的起源于理解
线性代数·数学建模·矩阵
100分题库小程序3 小时前
湖北建筑安全员C1证考试难度怎么样
经验分享·笔记