【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离

news2025/2/11 10:57:19

多维动态规划

  • 机器人路径问题
    • 思路
    • 代码实现
  • 最小路径和问题
    • 动态规划思路
      • 状态转移方程
      • 边界条件
    • 代码实现
  • 最长回文子串
    • 思路
    • 代码实现
  • 最长公共子序列(LCS)
    • 题目描述
    • 解决方案 —— 动态规划
      • 1. 状态定义
      • 2. 状态转移方程
      • 3. 初始化
      • 4. 代码实现
  • 编辑距离(Edit Distance)
    • 题目描述
    • 解法:动态规划
      • 状态转移方程
      • 边界条件
    • 代码实现
  • 二维动态规划答题总结
    • 1. 识别动态规划问题
    • 2. 解决二维 DP 题目的通用步骤
      • Step 1: 定义 DP 数组
      • Step 2: 确定状态转移方程
      • Step 3: 初始化边界条件
      • Step 4: 计算 DP 数
      • Step 5: 优化空间复杂度
    • 3. 典型题目总结

机器人路径问题

给定一个 ( m × n ) ( m \times n ) (m×n) 的网格,机器人位于左上角(起始点 “Start”),只能向下或者向右移动一步,目标是到达右下角(终点 “Finish”)。求总共有多少条不同的路径?


思路

  1. 状态定义
    用二维数组 dp[i][j] 表示到达网格中位置 ( i , j ) (i, j) (i,j) 的不同路径数。

  2. 状态转移
    由于机器人只能从上方或左侧移动到 ( i , j ) (i, j) (i,j)
    [ d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] ] [ dp[i][j] = dp[i-1][j] + dp[i][j-1] ] [dp[i][j]=dp[i1][j]+dp[i][j1]]

  3. 初始化

    • 起点:dp[0][0] = 1
    • 第一行 ( i = 0 ) (i = 0) (i=0)上的所有位置只能从左边到达,因此路径数均为 1。
    • 第一列 ( j = 0 ) (j = 0) (j=0)上的所有位置只能从上面到达,因此路径数均为 1。
  4. 答案
    最终答案为 dp[m-1][n-1]

代码实现

class Solution {
    public int uniquePaths(int m, int n) {
        // 创建一个 m x n 的二维数组 dp,用于记录每个位置的路径数
        int[][] dp = new int[m][n];
        
        // 初始化第一列,每个位置只有一种路径(一直向下走)
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }
        
        // 初始化第一行,每个位置只有一种路径(一直向右走)
        for (int j = 0; j < n; j++) {
            dp[0][j] = 1;
        }
        
        // 计算其他位置的路径数
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                // 当前格子的路径数等于上方格子和左侧格子的路径数之和
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        
        // 返回右下角的路径数
        return dp[m - 1][n - 1];
    }
}

最小路径和问题

给定一个包含非负整数的 ( m × n ) ( m \times n ) (m×n) 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。


动态规划思路

我们可以使用动态规划来解决这个问题,定义状态 dp[i][j] 表示从起点 ((0, 0)) 到达位置 ((i, j)) 的最小路径和。

状态转移方程

  • 对于位置 ( i , j ) (i, j) (i,j),由于只能从上方 ( i − 1 , j ) (i-1, j) (i1,j) 或左侧 ( i , j − 1 ) (i, j-1) (i,j1) 移动过来,因此有:
    d p [ i ] [ j ] = g r i d [ i ] [ j ] + min ⁡ ( d p [ i − 1 ] [ j ] ,   d p [ i ] [ j − 1 ] ) dp[i][j] = grid[i][j] + \min(dp[i-1][j],\ dp[i][j-1]) dp[i][j]=grid[i][j]+min(dp[i1][j], dp[i][j1])

边界条件

  • 起点
    d p [ 0 ] [ 0 ] = g r i d [ 0 ] [ 0 ] dp[0][0] = grid[0][0] dp[0][0]=grid[0][0]
  • 第一行
    只能从左侧移动,所以:
    d p [ 0 ] [ j ] = d p [ 0 ] [ j − 1 ] + g r i d [ 0 ] [ j ] (对于  j ≥ 1 ) dp[0][j] = dp[0][j-1] + grid[0][j] \quad \text{(对于 } j \ge 1\text{)} dp[0][j]=dp[0][j1]+grid[0][j](对于 j1)
  • 第一列
    只能从上面移动,所以:
    d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] + g r i d [ i ] [ 0 ] (对于  i ≥ 1 ) dp[i][0] = dp[i-1][0] + grid[i][0] \quad \text{(对于 } i \ge 1\text{)} dp[i][0]=dp[i1][0]+grid[i][0](对于 i1)

代码实现

下面是基于上述思路的 Java 代码实现:

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        
        // 创建 dp 数组,dp[i][j] 表示到达 (i, j) 的最小路径和
        int[][] dp = new int[m][n];
        
        // 初始化起点
        dp[0][0] = grid[0][0];
        
        // 初始化第一行
        for (int j = 1; j < n; j++) {
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }
        
        // 初始化第一列
        for (int i = 1; i < m; i++) {
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        }
        
        // 填充 dp 数组的剩余部分
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = grid[i][j] + Math.min(dp[i - 1][j], dp[i][j - 1]);
            }
        }
        
        // 返回右下角的最小路径和
        return dp[m - 1][n - 1];
    }
}

最长回文子串

给定一个字符串 s,找出 s 中最长的回文子串。


思路

我们可以利用动态规划来解决该问题。设 dp[i][j] 表示子串 s[i...j] 是否为回文。状态转移方程为:

d p [ i ] [ j ] = ( s [ i ] = = s [ j ] )   & &   ( j − i < 3  或  d p [ i + 1 ] [ j − 1 ] ) dp[i][j] = (s[i] == s[j]) \, \&\& \, (j - i < 3 \text{ 或 } dp[i+1][j-1]) dp[i][j]=(s[i]==s[j])&&(ji<3  dp[i+1][j1])

具体说明如下:

  • s[i]s[j] 不相等时,s[i...j] 不是回文,故 dp[i][j] = false
  • s[i]s[j] 相等时:
    • 如果子串长度小于等于 3(即 j - i < 3),那么 s[i...j] 一定是回文,因为此时中间最多只有一个字符。
    • 如果子串长度大于 3,则需依赖子串 s[i+1...j-1] 是否为回文,即 dp[i+1][j-1]

在更新过程中,我们记录当前最长回文子串的起始位置和长度,最终返回最长的回文子串。


代码实现

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        if (n < 2) return s; // 如果字符串长度小于 2,直接返回 s
        
        // dp[i][j] 表示 s[i...j] 是否为回文子串
        boolean[][] dp = new boolean[n][n];
        int maxLen = 1;  // 记录最长回文子串的长度
        int start = 0;   // 记录最长回文子串的起始位置
        
        // 所有单个字符都是回文子串
        for (int i = 0; i < n; i++) {
            dp[i][i] = true;
        }
        
        // 枚举子串的结束位置 j,从 1 到 n-1
        for (int j = 1; j < n; j++) {
            // 枚举子串的起始位置 i,从 0 到 j-1
            for (int i = 0; i < j; i++) {
                if (s.charAt(i) == s.charAt(j)) {
                    // 如果子串长度小于等于 3,则必为回文;否则看内部子串是否为回文
                    if (j - i < 3) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                } else {
                    dp[i][j] = false;
                }
                
                // 如果 dp[i][j] 为 true 且子串长度大于当前记录的最长长度,则更新结果
                if (dp[i][j] && j - i + 1 > maxLen) {
                    maxLen = j - i + 1;
                    start = i;
                }
            }
        }
        
        return s.substring(start, start + maxLen);
    }
}

最长公共子序列(LCS)

题目描述

给定两个字符串 text1text2,返回它们的 最长公共子序列(LCS)的长度。如果不存在公共子序列,则返回 0

定义:

  • 子序列:从字符串中删除某些字符(也可以不删除),但不改变字符的相对顺序后形成的新字符串。
  • 公共子序列:同时属于 text1text2 的子序列。

解决方案 —— 动态规划

1. 状态定义

dp[i][j] 表示 text1[0:i]text2[0:j] 的最长公共子序列的长度。

2. 状态转移方程

  • text1[i-1] == text2[j-1](即当前字符相同):
    d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j] = dp[i-1][j-1] + 1 dp[i][j]=dp[i1][j1]+1
  • text1[i-1] != text2[j-1](即当前字符不同):
    d p [ i ] [ j ] = max ⁡ ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) dp[i][j]=max(dp[i1][j],dp[i][j1])
    取两种删除策略的最大值:
    • dp[i-1][j]:删除 text1 的当前字符
    • dp[i][j-1]:删除 text2 的当前字符

3. 初始化

  • dp[0][j] = 0(空字符串 text1text2 的最长公共子序列长度为 0)
  • dp[i][0] = 0(同理)

4. 代码实现

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int m = text1.length(), n = text2.length();
        int[][] dp = new int[m + 1][n + 1];

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[m][n];
    }
}

dp 数组大小是 (m+1) × (n+1),是为了处理空字符串,避免 dp[i-1][j-1] 边界问题。
这样可以统一状态转移方程,减少边界检查,提高代码的可读性和稳定性。

编辑距离(Edit Distance)

题目描述

给定两个单词 word1word2,请返回将 word1 转换成 word2 所使用的最少操作数。

可以对一个单词进行如下三种操作:

  1. 插入一个字符
  2. 删除一个字符
  3. 替换一个字符

解法:动态规划

我们定义 dp[i][j]word1[0:i] 转换为 word2[0:j] 所需的最少操作数

状态转移方程

  1. 如果 word1[i-1] == word2[j-1](即当前字符相同),则不需要额外操作:
    d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i1][j1]

  2. 如果 word1[i-1] ≠ word2[j-1](即当前字符不同),可以执行三种操作:

    • 插入字符dp[i][j-1] + 1):相当于在 word1 插入 word2[j-1],这样 word1[0:i] 变成 word2[0:j]
    • 删除字符dp[i-1][j] + 1):相当于删除 word1[i-1],这样 word1[0:i-1] 变成 word2[0:j]
    • 替换字符dp[i-1][j-1] + 1):将 word1[i-1] 变成 word2[j-1],这样 word1[0:i] 变成 word2[0:j]

    取三者最小值:
    d p [ i ] [ j ] = min ⁡ ( d p [ i − 1 ] [ j − 1 ] + 1 , d p [ i ] [ j − 1 ] + 1 , d p [ i − 1 ] [ j ] + 1 ) dp[i][j] = \min(dp[i-1][j-1] + 1, \quad dp[i][j-1] + 1, \quad dp[i-1][j] + 1) dp[i][j]=min(dp[i1][j1]+1,dp[i][j1]+1,dp[i1][j]+1)

边界条件

  • dp[0][j] = jword1 为空,需要插入 j 个字符)
  • dp[i][0] = iword2 为空,需要删除 i 个字符)

代码实现

class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length(), n = word2.length();
        int[][] dp = new int[m + 1][n + 1];

        // 初始化边界条件
        for (int i = 0; i <= m; i++) dp[i][0] = i;
        for (int j = 0; j <= n; j++) dp[0][j] = j;

        // 计算 dp 数组
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1]; // 无需操作
                } else {
                    dp[i][j] = Math.min(dp[i - 1][j - 1],  // 替换
                                        Math.min(dp[i - 1][j],  // 删除
                                                 dp[i][j - 1])) + 1; // 插入
                }
            }
        }
        return dp[m][n];
    }
}

二维动态规划答题总结

1. 识别动态规划问题

当问题具有以下特征时,可以考虑使用动态规划(Dynamic Programming, DP):

  • 最优子结构(Optimal Substructure):问题可以拆解成子问题,且子问题的最优解可以构成原问题的最优解。
  • 重叠子问题(Overlapping Subproblems):子问题在递归求解过程中被多次计算。
  • 状态转移(State Transition):能够从小规模问题推导出大规模问题的解。

对于 二维动态规划,通常涉及两个字符串(或两个维度的数据),例如:

  • 子序列问题(如最长公共子序列 LCS)
  • 子数组/子矩阵问题(如最小路径和、最大乘积子数组)
  • 字符串编辑问题(如编辑距离)

2. 解决二维 DP 题目的通用步骤

Step 1: 定义 DP 数组

确定 dp[i][j] 的含义,一般是:

  • 字符串匹配问题dp[i][j] 代表 text1[0:i]text2[0:j] 的匹配结果(如最长公共子序列)。
  • 路径问题dp[i][j] 代表到达 grid[i][j] 的最优解(如最短路径)。
  • 编辑距离dp[i][j] 代表 word1[0:i] 变成 word2[0:j] 的最少操作次数。

Step 2: 确定状态转移方程

一般来说,状态转移方程由以下情况组成:

  1. 字符匹配时的继承状态:如 dp[i][j] = dp[i-1][j-1](最长公共子序列)。
  2. 考虑不同操作的最优值
    • 取最小值(如 min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1)。
    • 取最大值(如 max(dp[i-1][j], dp[i][j-1]))。
    • 取累积值(如 dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1]))。

Step 3: 初始化边界条件

不同问题的边界初始化方式不同,常见情况:

  • 子序列问题
    • dp[i][0] = 0,因为空串与任何串的 LCS 都是 0。
    • dp[0][j] = 0,因为空串与任何串的 LCS 都是 0。
  • 路径问题
    • dp[0][j] 为前缀和(只能从左走)。
    • dp[i][0] 为前缀和(只能从上走)。
  • 编辑距离问题
    • dp[i][0] = i,表示 word1 变成空串需要 i 次删除。
    • dp[0][j] = j,表示空串变成 word2 需要 j 次插入。

Step 4: 计算 DP 数

  • 通过 两层循环 计算 dp[i][j](通常是 O(m × n))。
  • 先遍历 ,依赖于状态转移方程。

Step 5: 优化空间复杂度

通常二维 DP 使用 O(m × n) 的空间,可以优化至 O(n) 甚至 O(1)

  • 滚动数组:用两个数组 prevcurr 代替整个 dp 矩阵(适用于 LCS、编辑距离)。
  • 原地修改:如果问题允许,我们可以在原数组上修改(适用于路径问题)。

3. 典型题目总结

题目状态定义状态转移方程时间复杂度空间优化
最长公共子序列(LCS)dp[i][j] 代表 text1[0:i]text2[0:j] 的 LCS 长度dp[i][j] = dp[i-1][j-1] + 1(匹配)或 max(dp[i-1][j], dp[i][j-1])O(m × n)O(n)
编辑距离(Edit Distance)dp[i][j] 代表 word1[0:i] 变成 word2[0:j] 的最少操作次数dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1O(m × n)O(n)
最小路径和dp[i][j] 代表到达 grid[i][j] 的最小路径和dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])O(m × n)O(n)
最长回文子串(中心扩展或 DP)dp[i][j] 代表 s[i:j] 是否是回文dp[i][j] = (s[i] == s[j] && dp[i+1][j-1])O(n²)O(n²) → O(1)

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

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

相关文章

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

c++----函数重载

目录标题 为什么会有函数重载函数重载的概念函数重载的例子第一个&#xff1a;参数的类型不同第二个&#xff1a;参数的个数不同第三种&#xff1a;类型的顺序不同函数重载的奇异性重载函数的底层原理有关函数重载的一个问题 为什么会有函数重载 大家在学c语言的时候有没有发现…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…

多头自注意力中的多头作用及相关思考

文章目录 1. num_heads2. pytorch源码演算 1. num_heads 将矩阵的最后一维度进行按照num_heads的方式进行切割矩阵&#xff0c;具体表示如下&#xff1a; 2. pytorch源码演算 pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xff0…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型&#xff0c;已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案&#xff0c;关键在于如何与它“沟通”&#xff0c;也就是如何设计提示词&#xff08;Prompt&#xff09;。以下是一些实用的提示词案例&#xff0c;帮助你解锁 ChatG…

分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度

一、背景 1.1 产品简介 基于大模型塔斯&#xff0c;整合传统的多项能力&#xff08;NLP、OCR、CV等&#xff09;&#xff0c;构建以场景为中心的新型智能文档平台。通过文档审阅&#xff0c;实现结构化、半结构化和非结构化文档的信息获取、处理及审核&#xff0c;同时基于大…

8.flask+websocket

http是短连接&#xff0c;无状态的。 websocket是长连接&#xff0c;有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…

【大模型实战】使用Ollama+Chatbox实现本地Deepseek R1模型搭建

下载安装Ollama Ollama官方链接:https://ollama.com/,打开链接后就可以看到大大的下载按钮,如下图: 我选择用Win的安装。将Ollama的安装包下载到本地,如果下载慢可以复制链接到迅雷里面,提高下载速度,如下图: 双击之后,就可以开始安装了,如下图: 默认安装到C盘,…

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图&#xff0c;在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …

【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归&#xff08;Ridge Regression&#xff09;中的 α 值 岭回归&#xff08;Ridge Regression&#xff09;是一种 带有 L2​ 正则化 的线性回归方法&#xff0c;用于处理多重共线性&#xff08;Multicollinearity&#xff09;问题&#xff0c;提高模型的泛化能力。其中&am…

9 Pydantic复杂数据结构的处理

在构建现代 Web 应用时&#xff0c;我们往往需要处理复杂的输入和输出数据结构。例如&#xff0c;响应数据可能包含嵌套字典、列表、元组&#xff0c;甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库&#xff0c;可以帮助我们轻松地处理这些复杂的数据结构&#…

Day62_补20250210_图论part6_108冗余连接|109.冗余连接II

Day62_20250210_图论part6_108冗余连接|109.冗余连接II 108冗余连接 【把题意转化为并查集问题】 题目 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&am…

kafka消费端之消费者协调器和组协调器

文章目录 概述回顾历史老版本获取消费者变更老版本存在的问题 消费者协调器和组协调器新版如何解决老版本问题再均衡过程**第一阶段CFIND COORDINATOR****第二阶段&#xff08;JOINGROUP&#xff09;**选举消费组的lcader选举分区分配策略 第三阶段&#xff08;SYNC GROUP&…

IDEA升级出现问题Failed to prepare an update Temp directory inside installation

IDEA升级出现问题"Failed to prepare an update Temp directory inside installation…" 问题来源&#xff1a; 之前修改了IDEA的默认配置文件路径&#xff0c;然后升级新版本时就无法升级&#xff0c;提示"Failed to prepare an update Temp directory insid…

十款开源的论坛建站工具

以下是十款开源的论坛建站工具&#xff0c;它们各具特色&#xff0c;能够满足不同用户的需求&#xff1a; Discuz!&#xff08;Crossday Discuz! Board&#xff09; 特点&#xff1a;基础架构采用web编程组合PHPMySQL&#xff0c;用户可以在不需要任何编程的基础上&#xff0c;…

vue学习6

1. 智慧商城 1. 路由设计配置 单个页面&#xff0c;独立展示的&#xff0c;是一级路由 2.二级路由配置 规则&组件配置导航链接配置路由出口 <template><div id"app"><!--二级路由出口--><router-view></router-view><van-…

线程池以及日志、线程总结

一、线程池以及日志 1、基础线程池写法 主线程在main函数中构建一个线程池&#xff0c;初始化(Init)后开始工作(Start) 此时线程池中每个线程都已经工作起来了&#xff0c;只是任务队列中任务为空&#xff0c;所有线程处于休眠状态(通过线程同步中的条件变量实现&#xff0c…

Vue 响应式渲染 - 过滤应用

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue响应式渲染综合 - 过滤应用 目录 过滤应用 引入vue Vue设置 设置页面元素 模糊查询过滤实现 函数表达式实现 总结 过滤应用 综合响应式渲染做一个输入框&#xff0c;用来实现&#xff1b;搜索输入框关键词符合列表。…