diffusion model 学习笔记

条件引导的 diffusion

对于无条件的DDPM 而言

p ( x t ∣ x 0 ) ∼ N ( α t ˉ x 0 , 1 − α t ˉ ⋅ I ) p(x_t | x_0) \sim \mathcal{N}( \sqrt{\bar{\alpha_t}} x_0, 1-\bar{\alpha_t} \cdot \mathrm{I} ) p(xtx0)N(αtˉ x0,1αtˉI)

可以得到

log ⁡ p ( x t ∣ x 0 ) = − 1 2 ( x t − α t ˉ x 0 ) 2 1 − α t ˉ \begin{aligned} \log p(x_t|x_0) &= - \frac{1}{2} \frac{ (x_t - \sqrt{\bar{\alpha_t}} x_0) ^ 2 }{ 1-\bar{\alpha_t} } \end{aligned} logp(xtx0)=211αtˉ(xtαtˉ x0)2

计算其 score func, 可以得到

∇ x log ⁡ p ( x t ∣ x 0 ) = − ( x t − α t ˉ x 0 ) 1 − α t ˉ = − ϵ 1 − α t ˉ ≈ − ϵ θ ( x t , t ) 1 − α t ˉ \begin{aligned} \nabla_x \log p(x_t|x_0) &= -\frac{ (x_t - \sqrt{\bar{\alpha_t}} x_0) }{ 1-\bar{\alpha_t} } \\ &= -\frac{ \epsilon } { \sqrt{1-\bar{\alpha_t}} } \\ & \approx -\frac{ \epsilon_{\theta}(x_t, t) }{ \sqrt{1-\bar{\alpha_t}} } \end{aligned} xlogp(xtx0)=1αtˉ(xtαtˉ x0)=1αtˉ ϵ1αtˉ ϵθ(xt,t)

也就是,我们训练的网络conditionalUnet 输出的是噪声的估计, 这个估计的噪声 ϵ θ ( x t , t ) \epsilon_{\theta}(x_t, t) ϵθ(xt,t)可以用来计算当前数据点在整个概率空间中的score-func: ∇ x log ⁡ p ( x t ∣ x 0 ) \nabla_x \log p(x_t|x_0) xlogp(xtx0).


对于 conditional Diffusion. 其 score func 可以写成

∇ x t log ⁡ p ( x t ∣ y ) = ∇ x t log ⁡ ( p ( x t ) ⋅ p ( y ∣ x t ) p ( y ) ) = ∇ x t log ⁡ p ( x t ) + ∇ x t log ⁡ p ( y ∣ x t ) − ∇ x t log ⁡ p ( y ) ⏟ = 0 和 x t 无关 = ∇ x t log ⁡ p ( x t ) ⏟ u n c o n d i t i o n a l s c o r e + ∇ x t log ⁡ p ( y ∣ x t ) ⏟ a d v e r s i a l g r a d i e n t \begin{aligned} \nabla_{x_t} \log p(x_t|y) &= \nabla_{x_t} \log \left ( \frac{ p(x_t) \cdot p(y|x_t) }{ p(y) } \right) \\ &= \nabla_{x_t} \log p(x_t) + \nabla_{x_t} \log p(y|x_t) - \underbrace{\nabla_{x_t} \log p(y)} _{=0 \ \ 和 x_t 无关} \\ &= \underbrace{ \nabla_{x_t} \log p(x_t)}_{ \mathrm{unconditional\ score} } + \underbrace{ \nabla_{x_t} \log p(y|x_t) }_{ \mathrm{adversial\ gradient} } \end{aligned} xtlogp(xty)=xtlog(p(y)p(xt)p(yxt))=xtlogp(xt)+xtlogp(yxt)=0  xt无关 xtlogp(y)=unconditional score xtlogp(xt)+adversial gradient xtlogp(yxt)

现在,我们需要估计 ∇ x t log ⁡ p ( x t ∣ y ) \nabla_{x_t} \log p(x_t|y) xtlogp(xty) 中的 ϵ ′ \epsilon' ϵ, 然后使用 DDPM/DDIM 采样即可. 不妨设

∇ x t log ⁡ p ( x t ∣ y ) = − ϵ ′ 1 − α t ˉ \begin{align} \nabla_{x_t} \log p(x_t|y) &= -\frac{ \epsilon' }{ \sqrt{ 1- \bar{\alpha_t}} } \end{align} xtlogp(xty)=1αtˉ ϵ

则我们有

∇ x t log ⁡ p ( x t ∣ y ) = ∇ x t log ⁡ p ( x t ) + ∇ x t log ⁡ p ( y ∣ x t ) ⏟ 令 = g − ϵ ′ 1 − α t ˉ = − ϵ 1 − α t ˉ + g 可得 : ϵ ′ = ϵ − 1 − α ˉ t ⋅ g \begin{align} \nabla_{x_t} \log p(x_t|y) &= \nabla_{x_t} \log p(x_t) + \underbrace{ \nabla_{x_t} \log p(y|x_t)}_{ 令 = g } \\ -\frac{ \epsilon' }{ \sqrt{ 1- \bar{\alpha_t}} } &= -\frac{ \epsilon }{ \sqrt{ 1- \bar{\alpha_t}} } + g \\ 可得 &: \epsilon' = \epsilon - \sqrt{1-\bar{\alpha}_t} \cdot g \end{align} xtlogp(xty)1αtˉ ϵ可得=xtlogp(xt)+=g xtlogp(yxt)=1αtˉ ϵ+g:ϵ=ϵ1αˉt g

即我们在无条件模型 DDPM 估计的噪声中添加一个微小的扰动( 1 − α ˉ t ⋅ g \sqrt{1-\bar{\alpha}_t}\cdot g 1αˉt g),就可以作为条件模型的噪声估计.


  • g = ∇ x t log ⁡ p ( y ∣ x t ) g = \nabla_{x_t} \log p(y|x_t) g=xtlogp(yxt) 的含义:

    条件概率的梯度: ∇ x t log ⁡ p ( y ∣ x t ) \nabla_{x_t} \log p(y|x_t) xtlogp(yxt) 表示的是在已知 x t x_t xt的情况下,微小变化 x t x_t xt如何影响条件 y y y的对数概率。这是一个 向量场,指向增加条件 y y y出现概率的方向。

  • 如何得到 g

    假设我现在已经有了一个回归模型, 即 y = f ( x t , . . . ) y = f(x_t, ...) y=f(xt,...).

    输入一个数据 x t x_t xt, 返回其对应一个 logit 值.

    ## 输入: x_t, 模型 f
    x_t = torch.tensor(x_t, requires_grad=True)
    y = f(x_y)            ## pytorch model 预测其结果
    log_p = torch.log(y)  ## 计算 log 概率
    log_p.backward()      ## 计算梯度
    grad_x_t = x_t.grad   ## 获取梯度
    

Langevin Dynamics 采样

首先,假设我们已经有了一个训练好的score-func( s θ ( x ) s_{\theta}(x) sθ(x)). 已经接近于真实的 s ( x ) s(x) s(x), 即 s θ ( x ) = ∇ x log ⁡ p θ ( x ) s_{\theta}(x)=\nabla_{x} \log p_{\theta}(x) sθ(x)=xlogpθ(x), 其中 p θ ( x ) ≈ p ( x ) p_{\theta}(x) \approx p(x) pθ(x)p(x). 现在, 我们需要利用 s θ ( x ) s_{\theta}(x) sθ(x) 对 x 进行采样,使得 x ∼ p θ ( x ) x \sim p_{\theta}(x) xpθ(x)

郎之万公式: 描述了粒子做随机布朗运动 (粒子位置随时间变化的关系), 是一种 SDE, 描述了 由梯度力(即. U ( x ( t ) U(x(t) U(x(t))驱动并受到随机噪声(即. Z t Z_t Zt)影响的系统的时间演化.

d X ( t ) = − ∇ x U ( x ( t ) ) ⋅ d t + σ d t ⋅ Z t dX(t) = -\nabla_x U(x(t)) \cdot dt + \sigma \sqrt{dt} \cdot Z_t dX(t)=xU(x(t))dt+σdt Zt

X ( t ) X(t) X(t):


Diffuser 源码解读

DDPMSchedule

1. α , α ˉ , β \alpha, \bar{\alpha}, \beta α,αˉ,β 的关系和计算

x t = α t ⋅ x t − 1 + 1 − α t ⋅ ϵ t = ∏ i = 1 t α i ⋅ x 0 + 1 − ∏ i = 1 t α i ⋅ ϵ 0 = α t ˉ ⋅ x 0 + 1 − α t ˉ ⋅ ϵ 0 β t = 1 − α t \begin{align} x_t &= \sqrt{\alpha_t} \cdot x_{t-1} + \sqrt{ 1-\alpha_t } \cdot \epsilon_t \\ &= \sqrt{\prod_{i=1}^{t} \alpha_i } \cdot x_0 + \sqrt{1-\prod_{i=1}^{t}\alpha_i} \cdot \epsilon_0 \\ &= \sqrt{\bar{\alpha_t}} \cdot x_0 + \sqrt{1-\bar{\alpha_t}} \cdot \epsilon_0 \\ \beta_t &= 1-\alpha_t \end{align} xtβt=αt xt1+1αt ϵt=i=1tαi x0+1i=1tαi ϵ0=αtˉ x0+1αtˉ ϵ0=1αt

  • DDPMSchedule 中, 先计算出 β t \beta_t βt 的值,然后利用 α t = 1 − β t \alpha_t = 1- \beta_t αt=1βt 计算剩下的系数。

  • self.beta 的计算有各种不同的方法,

    • trained_betas: 需要传入自定义的beta
    • linear
    • squaredcos_cap_v2
  • alphaalpha_cumprod 的计算

    self.alphas = 1.0 - self.betas
    self.alphas_cumprod = torch.cumprod(self.alphas, dim=0)
    # 累积乘积(cumulative product)
    
  • self.betas: 是扩散过程中“噪声量”的度量。控制着每一步扩散过程中加入的噪声量的大小.

  • self.alphas: 每一步中保留的原始信号的比例。

图片描述

上图是 DDPM 中的 α \alpha α, β \beta β, α ˉ \bar{\alpha} αˉ 的关系。

2. 计算前向时刻的采样: x t → x t − 1 x_t \rightarrow x_{t-1} xtxt1

q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) = N ( x t ; α t x t − 1 , ( 1 − α t ) I ) N ( x t − 1 ; α ˉ t − 1 x 0 , ( 1 − α ˉ t − 1 ) I ) N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) ∝ N ( x t − 1 ; α t ( 1 − α ˉ t − 1 ) x t + α ˉ t − 1 ( 1 − α t ) x 0 1 − α ˉ t ⏟ μ q ( x t , x 0 ) , ( 1 − α t ) ( 1 − α ˉ t − 1 ) 1 − α ˉ t I ⏟ Σ q ( t ) ) \begin{align} q(x_{t-1}|x_t, x_0) &= \frac{ q(x_t|x_{t-1}, x_0) q(x_{t-1}|x_0) }{ q(x_t|x_0) }\\ &= \frac{\mathcal{N}(x_{t} ; \sqrt{\alpha_t} x_{t-1}, (1 - \alpha_t)\textbf{I})\mathcal{N}(x_{t-1} ; \sqrt{\bar\alpha_{t-1}}x_0, (1 - \bar\alpha_{t-1}) \textbf{I})}{\mathcal{N}(x_{t} ; \sqrt{\bar\alpha_{t}}x_0, (1 - \bar\alpha_{t})\textbf{I})} \\ &\propto \mathcal{N}( x_{t-1} ; \underbrace{\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})x_{t} + \sqrt{\bar\alpha_{t-1}}(1-\alpha_t)x_0}{1 -\bar\alpha_{t}}}_{\mu_q(x_t, x_0)}, \underbrace{\frac{(1 - \alpha_t)(1 - \bar\alpha_{t-1})}{1 -\bar\alpha_{t}}\textbf{I}}_{{\Sigma}_q(t)}) \end{align} q(xt1xt,x0)=q(xtx0)q(xtxt1,x0)q(xt1x0)=N(xt;αˉt x0,(1αˉt)I)N(xt;αt xt1,(1αt)I)N(xt1;αˉt1 x0,(1αˉt1)I)N(xt1;μq(xt,x0) 1αˉtαt (1αˉt1)xt+αˉt1 (1αt)x0,Σq(t) 1αˉt(1αt)(1αˉt1)I)

通过上面的公式,我们可以知道,当知道 x 0 x_0 x0 x t x_t xt, 既可以得到 x t − 1 x_{t-1} xt1. 但是, 我们没有办法获取真实的 x 0 x_0 x0, 所以只能估计 x t x_t xt 对应的 x ^ 0 \hat{x}_0 x^0 是什么样子的。

μ q ( x t , x 0 ) = α t ( 1 − α ˉ t − 1 ) x t + α ˉ t − 1 ( 1 − α t ) x 0 1 − α ˉ t Σ q ( t ) = ( 1 − α t ) ( 1 − α ˉ t − 1 ) 1 − α ˉ t I \begin{align} \mu_q(x_t, x_0) &= \frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})x_{t} + \sqrt{\bar\alpha_{t-1}}(1-\alpha_t)x_0}{1 -\bar\alpha_{t}} \\ {\Sigma}_q(t) &= \frac{(1 - \alpha_t)(1 - \bar\alpha_{t-1})}{1 -\bar\alpha_{t}}\textbf{I} \end{align} μq(xt,x0)Σq(t)=1αˉtαt (1αˉt1)xt+αˉt1 (1αt)x0=1αˉt(1αt)(1αˉt1)I

  • 第一种: 先利用预测的噪声 ϵ t \epsilon_t ϵt 估计 x ^ 0 \hat{x}_0 x^0. 然后利用 x t x_t xt x ^ 0 \hat{x}_0 x^0 估计 x t − 1 x_{t-1} xt1

x ^ 0 t − 1 = x t − 1 − α ˉ t ⋅ ϵ θ ( x t , t ) α ˉ t \begin{align} \hat{x}_0^{t-1} &= \frac{ x_t - \sqrt{1-\bar{\alpha}_t} \cdot \epsilon_{\theta}(x_t, t) }{ \sqrt{\bar{\alpha}_t} } \end{align} x^0t1=αˉt xt1αˉt ϵθ(xt,t)

x ^ 0 t − 1 \hat{x}_0^{t-1} x^0t1 表示第 t − 1 t-1 t1时刻估计的 x 0 x_0 x0. 基本上,在采样一半时,基本上预测的 x 0 x_0 x0 就和真实图片差不多了.

接下来计算 x t − 1 x_{t-1} xt1 的均值和方差. 方差非常重要,不能忽略
m e a n ( x t − 1 ) = α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t ⋅ x t + α ˉ t − 1 ( 1 − α t ) 1 − α ˉ t ⋅ x ^ 0 t − 1 v a r ( x t − 1 ) = ( 1 − α t ) ( 1 − α ˉ t − 1 ) 1 − α ˉ t ⋅ I x t − 1 = m e a n ( x t − 1 ) + v a r ( x t − 1 ) \begin{align} \mathrm{mean}(x_{t-1}) &= \frac{ \sqrt{\alpha_t}(1-\bar{\alpha}_{t-1}) }{ 1-\bar{\alpha}_{t} } \cdot x_t + \frac{ \sqrt{\bar{\alpha}_{t-1}}(1-\alpha_t) }{ 1-\bar{\alpha}_{t} } \cdot \hat{x}_0^{t-1} \\ \mathrm{var}(x_{t-1}) &= \frac{(1 - \alpha_t)(1 - \bar\alpha_{t-1})}{1 -\bar\alpha_{t}} \cdot \textbf{I} \\ x_{t-1} &= \mathrm{mean}(x_{t-1}) + \mathrm{var}(x_{t-1}) \end{align} mean(xt1)var(xt1)xt1=1αˉtαt (1αˉt1)xt+1αˉtαˉt1 (1αt)x^0t1=1αˉt(1αt)(1αˉt1)I=mean(xt1)+var(xt1)

for i, t in enumerate(ddpm_scheduler.timesteps):alpha_t = alphas[t] alpha_t_bar = alphas_cumprod[t]alpha_t_bar_prev = alphas_cumprod[t - 1] if t - 1 >= 0 else torch.tensor(1.0)# -------------## 1. x_0 和 x_t的系数pred_ori_sample_coeff = torch.sqrt(alpha_t_bar_prev) * (1-alpha_t) / (1-alpha_t_bar)current_sample_coeff = torch.sqrt(alpha_t) * (1-alpha_t_bar_prev) / (1-alpha_t_bar)## 2. 预测 x_0noise_pred = ddpm_noise_model(x_t, t)['sample']est_x_0 = (x_t - torch.sqrt(1-alpha_t_bar) * noise_pred) / torch.sqrt(alpha_t_bar)## 3. clip x_0est_x_0 = est_x_0.clamp(-1, 1)## 4. 预测 x_{t-1}x_t_prev = pred_ori_sample_coeff * est_x_0 + current_sample_coeff * x_t## 5. 添加噪声if t > 0:std_var_noise = torch.randn_like(x_t).to(device)x_t_var_coeff = (1-alpha_t) * (1-alpha_t_bar_prev) / (1-alpha_t_bar)x_t_var_coeff = torch.sqrt(x_t_var_coeff)x_t_prev = x_t_prev + x_t_var_coeff * std_var_noisex_t = x_t_prev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3854.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云高并发测试-Redis缓存机制

创建接口 这里使用的是阿里云提供的接口服务直接做的测试,接口地址 curl http://localhost:8080/initData?tokenAppWithRedis 这里主要通过参数cacheFirstfalse和true来区分是否走缓存,正常的业务机制可能是通过后台代码逻辑自行控制的,这…

设计卷积神经网络CNN为什么不是编程?

上一篇:《搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)》 序言:现在让我们开始走进卷积神经网络(CNN)的世界里。和传统编程完全不同,在人工智能的程序代码里…

气象仿真数据在光伏行业里面的作用

选址与规划 确定资源潜力区域:不同地区的太阳能资源、气候条件差异很大。通过对大量的气象仿真数据进行分析,可以准确评估不同地区的太阳辐射强度、日照时长、温度、湿度、风速风向以及降水情况等气象要素。规避潜在风险:一些地区可能存在极…

鸿蒙开发——进程模型与进程通信

1、进程模型 ❓ 什么是进程? 进程是一个正在执行的程序的实例。当我们启动一个程序时,操作系统会创建一个进程,分配给它所需的资源,如内存和CPU时间。每个进程至少有一个线程,即执行线程,负责执行程序的指…

Pod安装软件将CDN改为国内的镜像

1、碰到错误 在pod install的时候碰到以下的下载错误: 文字错误如下: CDN: trunk URL couldnt be downloaded: https://cdn.jsdelivr.net/cocoa/Specs/5/b/d/OpenCV/2.4.11/OpenCV.podspec.json Response: Timeout was reached CDN: trunk URL couldn…

Windows常用命令-病毒

1.常见端口对应的服务 ftp 21 tenlnet 23 80 web 80-89可能是web 443 ssl心脏滴血漏洞以及一些web漏洞测试 445 smb 1433 mssql 1521 oracle 2082/2083 cpanel主机管理系统登陆(国外用的较多) 2222 da虚拟主机管理系统登陆(国外较多) 3128 squid代理默认端口-漫游内…

DDD中的一些基础概念 观点摘录

系统复杂度来源于哪?也就是DDD存在意义 软件系统的复杂性主要体现在三个方面。 隐晦:一是抽象层面的隐晦,抽象系统时,每个人都有自己特定的视角,你需要站在对方的角度才能明白他为什么这么做;其次是实现层…

统信UOS开发环境支持shell

内置了Bash等流行的Shell环境,用户可编写自动化脚本,极大地提高了系统管理和应用开发效率。 文章目录 一、环境部署1. shell开发环境安装2. shell开发环境配置二、代码示例shell开发案例三、常见问题1. 文件处理2. 错误处理3. 跨平台兼容性一、环境部署 1. shell开发环境安装…

使用compare做简单的点云滤波,并另存为文件

一、打开compare软件后,打开一个pcd文件 二、点击显示的pcd文件对象,出现如图黄色框框 三、点击上边的菜单栏的这个标志 四、出现如下图,此时调整红绿蓝就可以简单的做一下背景的滤波操作 五、我调整蓝色按钮后将背景点云去除,点…

布谷语音源码服务器搭建环境及配置流程

布谷语音源码部署环境安装要求(只有在相同的环境下才更容易避免一些不必要的麻烦):●安装Center OS 7.9,我们自己的服务器使用的是7.9建议相同系统,非强制●安装宝塔环境(强烈推荐使用)●安装软…

奥数与C++小学四年级(第二十题 猜猜看)

参考程序代码&#xff1a; #include <iostream> using namespace std;int main() {// 集合 {1, 2, 3, 4, 5, 6, 7, 8}int set[] {1, 2, 3, 4, 5, 6, 7, 8};// 枚举所有可能的 5 个数for (int i 0; i < 8; i) {for (int j i 1; j < 8; j) {for (int k j 1; k…

关于游戏加加不可以在cs2中显示的解决方案

输入的代码如下 -allow_third_party_software 1.打开steam 右键cs2&#xff0c;打开属性。 然后再这里填上这个代码就可以了

QGIS:HCMGIS插件

插件GitHub地址&#xff1a;https://github.com/thangqd/HCMGIS。 以下对HCMGIS插件进行简单介绍&#xff0c;并演示如何进行地图数据下载。 插件简介 HCMGIS - Basemaps, Download OpenData, Batch Converter, VN-2000 Projections, and Field Calculation Utilities for QGI…

康姿百德典雅床垫功效价格双佳,上班族睡眠升级的秘密武器

卓越支撑&#xff0c;透气之选 —— 康姿百德集团公司典雅床垫引领睡眠新风尚 选择一款优质的床垫对于确保良好的睡眠至关重要&#xff0c;尤其是对于每日辛勤工作的上班族而言。一天结束后&#xff0c;躺在舒适的床垫上&#xff0c;享受深度睡眠的美好体验&#xff0c;是最放…

103 - Lecture 3

SQL - Table and Data Part 2 一、Table Constraints Table constraints can be defined when creating tables. But you can also add constraints to an existing table. 1. Syntax of Constraints • General Syntax: CONSTRAINT name TYPE details; • 约束名称是为了以后…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

nuPlan最新SOTA,香港科技大学发布基于学习决策范围内的规划PlanScope

nuPlan最新SOTA&#xff0c;香港科技大学发布基于学习决策范围内的规划PlanScope Abstract 在自动驾驶的背景下&#xff0c;基于学习的方法在规划模块的开发中表现出了很大的潜力。在规划模块的训练过程中&#xff0c;直接最小化专家驾驶日志与规划输出之间的差异是一种广泛采…

MATLAB实现人工免疫网络算法(Artificial Immune Network Algorithm, AINA)

1. 免疫网络算法简介 生物免疫系统是自然界中最复杂、最有效的自适应系统之一&#xff0c;它能够识别并清除入侵的病原体&#xff0c;同时保持对自身细胞的忍耐。免疫网络算法是一种借鉴生物免疫系统原理和机制的计算模型 2.算法流程 3.MATLAB代码 完整代码见: https://down…

MySQL初学之旅(1)配置与基础操作

目录 1.前言 2.正文 2.1数据库的发展历程 2.2数据库的基础操作 2.2.1启动服务 2.2.2创建与删除数据库 2.2.3数据类型 2.2.4创建表与删除表 2.3MySQL Workbench基础使用简介 3.小结 1.前言 哈喽大家好吖&#xff0c;今天博主正式开始为大家分享数据库的学习&#xff…

【优选算法】——滑动窗口(下篇)!

目录 1、水果成篮 2、找到字符串中所有字母异位词 3、串联所有单词的子串 4、最小覆盖子串 1、水果成篮 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能…