-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.json
1 lines (1 loc) · 49.6 KB
/
search.json
1
[{"title":"力扣133.克隆图","date":"2022-03-10T09:00:00.000Z","url":"/2022/03/10/%E5%8A%9B%E6%89%A3133.%E5%85%8B%E9%9A%86%E5%9B%BE/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣133.克隆图题解 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; public List neighbors;} 测试用例格式: 简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。 邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。 给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。 示例 1: 输入:adjList = [[2,4],[1,3],[2,4],[1,3]]输出:[[2,4],[1,3],[2,4],[1,3]]解释:图中有 4 个节点。节点 1 的值是 1,它有两个邻居:节点 2 和 4 。节点 2 的值是 2,它有两个邻居:节点 1 和 3 。节点 3 的值是 3,它有两个邻居:节点 2 和 4 。节点 4 的值是 4,它有两个邻居:节点 1 和 3 。 示例 2: 输入:adjList = [[]]输出:[[]]解释:输入包含一个空列表。该图仅仅只有一个值为 1 的节点,它没有任何邻居。 示例 3: ****.**adjList = []输出:[]解释:这个图是空的,它不含任何节点。 示例 4: 输入:adjList = [[2],[1]]输出:[[2],[1]] 提示: 节点数不超过 100 。每个节点值 Node.val 都是唯一的,1 <= Node.val <= 100。无向图是一个简单图,这意味着图中没有重复的边,也没有自环。由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。图是连通图,你可以从给定节点访问到所有节点。 解析: 让我们返回深拷贝,仔细看题目的话不难发现本题的要求是给我们一个图的入口,我们需要在入口对图进行一个遍历,我们在遍历的过程中要做两件事,第一就是把遇到节点的值给拷贝出来,拷贝到一个新的空间中去,第二件事就是把值拷贝完了之后还需要把这个点与点之间的关系给拷贝出来,在给定的代码里面就是要把neighbors这个关系拷贝出来,也放到新的空间中去 那么我们知道了本题的考察点就是遍历,那我们可以通过bfs和dfs来解题,但是无论是dfs还是bfs我们都需要去维护一个新老节点的关系,我们设原先的节点为old node,新的节点为new node,还需要一个map来维护这样的一个映射关系,因为本体的本质就是遍历,dfs和bfs的时空复杂度都是一样的(即O(n)),我用dfs来试着解题, 代码: /* // Definition for a Node. class Node { public int val; public List<Node> neighbors; public Node() { val = 0; neighbors = new ArrayList<Node>(); } public Node(int _val) { val = _val; neighbors = new ArrayList<Node>(); } public Node(int _val, ArrayList<Node> _neighbors) { val = _val; neighbors = _neighbors; } } */ class Solution { Map<Node,Node> map = new HashMap<>(); public Node cloneGraph(Node node) { //null直接返回 if(node == null){ return null; } //map当中已经包含了node对应的新的节点 if(map.containsKey(node)){ return map.get(node); } //反之就需要进行copy, Node cur = new Node(node .val); //更新map,因为给node开辟了一个current的copy,我们需要把它存放到这个map的映射关系中,不然会出错 map.put(node,cur); `` for(Node nbr : node.neighbors){ //加入neighbor cur.neighbors.add(cloneGraph(nbr)); } return cur; } } 运行截图: "},{"title":"208. 实现 Trie (前缀树)","date":"2022-03-10T09:00:00.000Z","url":"/2022/03/10/%E5%8A%9B%E6%89%A3208.%20%E5%AE%9E%E7%8E%B0%20Trie%20(%E5%89%8D%E7%BC%80%E6%A0%91)/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":" 实现 Trie (前缀树)解析 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。 示例: 输入[“Trie”, “insert”, “search”, “search”, “startsWith”, “insert”, “search”][[], [“apple”], [“apple”], [“app”], [“app”], [“app”], [“app”]]输出[null, null, true, false, true, null, true] 解释Trie trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 Truetrie.search(“app”); // 返回 Falsetrie.startsWith(“app”); // 返回 Truetrie.insert(“app”);trie.search(“app”); // 返回 True 提示: 1 <= word.length, prefix.length <= 2000word 和 prefix 仅由小写英文字母组成insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次 一开始看到这个题,我就去看了题解( 主要是树已经忘记的差不多了,现在正在努力回忆中。。。,看见题解之后发现提示里面有一个 prefix.length <= 2000,???有什么单词是超过2000的吗?感觉这个就是纯粹在为了测试用例而测试用例,不说废话了,我在b站找到一个讲的很不错的视频,引用一下里面的图片 原地址: 首先题目提示给了所有单词只有小写字母,那么所有字母有26个,我们可以用指针来映射一下这26个位置,使得来代表这26个字母,查询时指针如果指向的地方有数据,那么就表明这个英文字母存在,就可以使得指针继续往下走,直到要求查询的前缀或者单词到了最后一个元素为止,当需要插入的时候会先查询一个个字母是否存在映射,如果存在就会继续往下走,如果没有的话就会自己创建新的节点,然后继续执行判断,直到最后一个字母。 这两个图就很好的反应了本题的要求,那我们直接来看代码: public class Trie { private Trie[] children; private boolean isEnd; /** Initialize your data structure here. */ public Trie() { // Trie前缀树(或者叫多叉单词查找数,字典树) // 每个节点开辟26个存储空间,因为最多的情况下有a-z,26个英文字母在当前树中都构成了可能的前缀字母 children = new Trie[26]; // 初始化单词结尾标示为false isEnd = false; } /** Inserts a word into the trie. */ public void insert(String word) { // node指针指向当前对象的头结点 Trie node = this; for(int i = 0; i < word.length(); ++i) { char ch = word.charAt(i); int index = ch - 'a'; if(node.children[index] == null) { node.children[index] = new Trie(); } node = node.children[index]; } node.isEnd = true; } /** Returns if the word is in the trie. */ public boolean search(String word) { // 调用前缀树遍历方法如果整个word遍历完了node还没指向空,并且正好指向一个isEnd标示为true说明当前单词存在 // 于前缀树中 Trie node = searchPrefix(word); return node != null && node.isEnd; } /** Returns if there is any word in the trie that starts with the given prefix. */ public boolean startsWith(String prefix) { // 调用前缀树遍历方法把prefix前缀单词装进去,如果最后返回的不是空指针说明前缀存在 return searchPrefix(prefix) != null; } // 查找单词是否存在于前缀树中遍历方法的封装 public Trie searchPrefix(String prefix) { Trie node = this; for(int i = 0; i < prefix.length(); ++i) { char ch = prefix.charAt(i); int index = ch - 'a'; if(node.children[index] == null) { return null; } node = node.children[index]; } return node; } } /** Your Trie object will be instantiated and called as such: Trie obj = new Trie(); obj.insert(word); boolean param_2 = obj.search(word); boolean param_3 = obj.startsWith(prefix);*/ 运行截图: 非常感谢提供解题方法的b站up主"},{"title":"力扣218. 天际线问题","date":"2022-03-10T09:00:00.000Z","url":"/2022/03/10/%E5%8A%9B%E6%89%A3218.%20%E5%A4%A9%E9%99%85%E7%BA%BF%E9%97%AE%E9%A2%98/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣218. 天际线问题解析 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示,其中三元组 buildings[i] = [lefti, righti, heighti] 表示: lefti 是第 i 座建筑物左边缘的 x 坐标。righti 是第 i 座建筑物右边缘的 x 坐标。heighti 是第 i 座建筑物的高度。你可以假设所有的建筑都是完美的长方形,在高度为 0 的绝对平坦的表面上。 天际线 应该表示为由 “关键点” 组成的列表,格式 [[x1,y1],[x2,y2],…] ,并按 x 坐标 进行 排序 。关键点是水平线段的左端点。列表中最后一个点是最右侧建筑物的终点,y 坐标始终为 0 ,仅用于标记天际线的终点。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。 注意:输出天际线中不得有连续的相同高度的水平线。例如 […[2 3], [4 5], [7 5], [11 5], [12 7]…] 是不正确的答案;三条高度为 5 的线应该在最终输出中合并为一个:[…[2 3], [4 5], [12 7], …] 示例 1: 输入:buildings = [[2,9,10],[3,7,15],[5,12,12],[15,20,10],[19,24,8]]输出:[[2,10],[3,15],[7,12],[12,0],[15,10],[20,8],[24,0]]解释:图 A 显示输入的所有建筑物的位置和高度, 图 B 显示由这些建筑物形成的天际线。图 B 中的红点表示输出列表中的关键点。 示例 2: 输入:buildings = [[0,2,3],[2,5,3]]输出:[[0,3],[5,0]] 提示: 1 <= buildings.length <= 104 0 <= lefti < righti <= 231 - 1 1 <= heighti <= 231 - 1 buildings 按 lefti 非递减排序 解析: 这个题目的要求很明确,输入的是每个建筑物在坐标中的x和y的坐标,要求我们输出关键点,显而易见的关键点就是高层建筑的左上角部分,但是由于建筑物的阴影遮罩问题,关键点是位于相对于高层建筑物的底层建筑物的相对投影处,我们需要建立一个算法来进行这个问题的求解。 找到一个非常不错的题解视频,引用了一下这个ppt: 我们这里用到的是这里用到的是所谓的扫描线用法,因为每一个建筑物有两条边平行与y轴,我们可以设置建筑物的将建筑物的左顶点坐标的y取负值,(输入给了每个建筑物的具体坐标,那我们就可以通过这一特点进行这一技巧的使用),我们需要新建立一个堆,具体用法结合图片所示: 我们直接来看下面的1~10,规则就是遇到负数就把其换算成正数入堆,同时这个正数和堆中的其他正数进行比较大小,如果这个数字是最大的,就把x轴的坐标和该正数一起返回,如果不是最大的,进行下一个坐标的入堆/出堆,如果遇到了正数(即某一建筑物的右侧边缘),我们就需要对其在堆中的数据进行出堆,如果出堆的这个数字并不是堆中最大的数字,那么这个地方不是关键点,进行下一个坐标的入堆/出堆,如果是最大的,那么就把x轴的坐标和该正数一起返回。 简单总结边缘线算法那就是 从左自右扫描每一条边缘线,遇到左比阿奴原先koi入堆建筑物高度,遇到右边缘线就出堆建筑物高度 若堆内高度发生了变化,则表明遇到了天际线的关键点 关键点表示为当前边缘线的x的坐标和堆内最大值,即[x,queue.top()] 但是在代码实现逻辑上我们还需要注意一种情况 现在紫色建筑物和绿色建筑物投影链接在一起,我们入堆的时候就需要由低到高入堆,不然扫描到绿色建筑物就会弹出,导致x,0成为关键点 具体实现如下: 我使用的是大顶堆,并设置了第一个堆内元素,这样就能扫到第一个关键点,然后就行扫描比对删除就可以了,但是我们弹出堆的时候只能弹出对应的数值,而不是大顶堆只能弹出最大的那个数 代码: class Solution { public List<List<Integer>> getSkyline(int[][] buildings) { List<List<Integer>> points = new ArrayList<>(); //求出左上角和右上角坐标, 左上角坐标的 y 存负数 for (int[] b : buildings) { points.add(Arrays.asList(b[0], -b[2])); points.add(Arrays.asList(b[1], b[2])); } //将所有坐标排序 points.sort( (O1, O2) -> { int x1 = O1.get(0), y1 = O1.get(1); int x2 = O2.get(0), y2 = O2.get(1); //这个就是对特殊情况的处理,由小变大 if (x1 != x2) return x1 - x2; else return y1 - y2; }); //默认的优先队列是小顶堆,我们需要大顶堆(算是吧),每次需要得到队列中最大的元素 Queue<Integer> queue = new PriorityQueue<>((O1, O2) -> O2 - O1); queue.offer(0); int preMax = 0; List<List<Integer>> res = new ArrayList<>(); for (List<Integer> p : points) { int x = p.get(0), y = p.get(1); //左上角坐标 if (y < 0) queue.offer(-y); //右上角坐标 else queue.remove(y); int curMax = queue.peek(); //最大值更新了, 将当前结果加入 if (curMax != preMax) { res.add(Arrays.asList(x, curMax)); preMax = curMax; } } return res; } } 截图: "},{"title":"力扣221.最大正方形","date":"2021-08-26T15:00:00.000Z","url":"/2021/08/26/%E5%8A%9B%E6%89%A3221.%20%E6%9C%80%E5%A4%A7%E6%AD%A3%E6%96%B9%E5%BD%A2%20Maximal%20Square/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣221.最大正方形题解 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。 示例 1: 输入:matrix = [[“1”,”0”,”1”,”0”,”0”],[“1”,”0”,”1”,”1”,”1”],[“1”,”1”,”1”,”1”,”1”],[“1”,”0”,”0”,”1”,”0”]]输出:4 示例 2: 输入:matrix = [[“0”,”1”],[“1”,”0”]]输出:1 示例 3: 输入:matrix = [[“0”]]输出:0 提示: 来源:力扣(LeetCode)链接: 这道题可以这样理解,逐个遍历,把每次遍历的地方当成该正方形的右下角,然后分别在该格子处向上,向左,向左上角试探,找寻满足正方形的格子,如果该格子在第一行或者第一列,那么就把最大值记为1或者0,把长度记下来平方即可求得面积 代码 结果 "},{"title":"力扣1226. 哲学家进餐题解","date":"2021-08-26T15:00:00.000Z","url":"/2021/08/26/%E5%8A%9B%E6%89%A31226.%20%E5%93%B2%E5%AD%A6%E5%AE%B6%E8%BF%9B%E9%A4%90/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣1226. 哲学家进餐题解 5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子) 所有的哲学家都只会在思考和进餐两种行为间交替。哲学家只有同时拿到左边和右边的叉子才能吃到面,而同一根叉子在同一时间只能被一个哲学家使用。每个哲学家吃完面后都需要把叉子放回桌面以供其他哲学家吃面。只要条件允许,哲学家可以拿起左边或者右边的叉子,但在没有同时拿到左右叉子时不能进食。 假设面的数量没有限制,哲学家也能随便吃,不需要考虑吃不吃得下。 设计一个进餐规则(并行算法)使得每个哲学家都不会挨饿;也就是说,在没有人知道别人什么时候想吃东西或思考的情况下,每个哲学家都可以在吃饭和思考之间一直交替下去。 问题描述和图片来自维基百科 wikipedia.org 哲学家从 0 到 4 按 顺时针 编号。请实现函数 void wantsToEat(philosopher, pickLeftFork, pickRightFork, eat, putLeftFork, putRightFork): philosopher 哲学家的编号。pickLeftFork 和 pickRightFork 表示拿起左边或右边的叉子。eat 表示吃面。putLeftFork 和 putRightFork 表示放下左边或右边的叉子。由于哲学家不是在吃面就是在想着啥时候吃面,所以思考这个方法没有对应的回调。给你 5 个线程,每个都代表一个哲学家,请你使用类的同一个对象来模拟这个过程。在最后一次调用结束之前,可能会为同一个哲学家多次调用该函数。 示例: 输入:n = 1输出:[[4,2,1],[4,1,1],[0,1,1],[2,2,1],[2,1,1],[2,0,3],[2,1,2],[2,2,2],[4,0,3],[4,1,2],[0,2,1],[4,2,2],[3,2,1],[3,1,1],[0,0,3],[0,1,2],[0,2,2],[1,2,1],[1,1,1],[3,0,3],[3,1,2],[3,2,2],[1,0,3],[1,1,2],[1,2,2]]解释:n 表示每个哲学家需要进餐的次数。输出数组描述了叉子的控制和进餐的调用,它的格式如下:output[i] = [a, b, c] (3个整数) a 哲学家编号。 b 指定叉子:{1 : 左边, 2 : 右边}. c 指定行为:{1 : 拿起, 2 : 放下, 3 : 吃面}。如 [4,2,1] 表示 4 号哲学家拿起了右边的叉子。 题目中已经有暗示了,需要使用多线程,但是我们本着能摸鱼就摸鱼的想法来看这个题目,可以找到一个更简单的方法(但是违反了本题考察多线程的本意, 五位哲学家在同一时刻做出选择有可能是都选择进餐,这时候由于只有五个叉子,就导致出现了每位哲学家都只拿到了一个叉子,出现了题目中的不允许现象(即每个哲学家都会挨饿,那么我们可以简单的加一个同步锁,把这个并发问题改成顺序执行的问题,这个冲突就可以轻松解决了 简直不要太简单! 截图如下: 但是这个题目不是让我们这样解题的,所以我们再来看看这个题目 那么思路就是要防止这个死锁问题 在这里提供一种思路: 只要让进餐的时候加一个限制条件,比如只能四个哲学家同时进餐,那么总有一个人可以拿到两把叉子进餐,这样就避免了死锁问题,那么这个方法具体体现在代码里就需要模拟一下,可以用五个信号来模拟五把叉子,在每一时刻确保叉子只能呗一个人抢到,这样就能达到上面的行为,那我们来具体实现一下 代码如下 果不其然,轻松翻车 怎么回事呢?我感觉这个判定方式有问题,当我修改上限为1的时候代码又能通过了, 总之就是非常奇怪,嘛反正也过了"},{"title":"力扣632.最小区间","date":"2021-08-26T15:00:00.000Z","url":"/2021/08/26/%E5%8A%9B%E6%89%A3632%E6%9C%80%E5%B0%8F%E5%8C%BA%E9%97%B4/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣632.最小区间 你有 k 个 非递减排列 的整数列表。找到一个 最小 区间,使得 k 个列表中的每个列表至少有一个数包含在其中。 我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。 示例 1: 输入:nums = [[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]输出:[20,24]解释:列表 1:[4, 10, 15, 24, 26],24 在区间 [20,24] 中。列表 2:[0, 9, 12, 20],20 在区间 [20,24] 中。列表 3:[5, 18, 22, 30],22 在区间 [20,24] 中。 示例 2: 输入:nums = [[1,2,3],[1,2,3],[1,2,3]]输出:[1,1] 提示: nums.length == k1 <= k <= 35001 <= nums[i].length <= 50-105 <= nums[i][j] <= 105nums[i] 按非递减顺序排列 解析,题目中说了每一条列表都是非递减的,那么那就拥有单调性,即每条列表的元素单调递增,观察一下示例,我们很容易会发现本题就是要找寻一个最小区间,使得这个区间包含列表的一个数字,我们来简单画一下图。emmm算了画工不好,就是我们先设置k个指针,分别访问到第一个每个列表的第一个数据上,然后用最大的数字减去最小的数字,这样就能得到一个区间长度,然后让指向这几个元素的最小项进行+1,移到下一位置上,然后继续比较区间的长度,一直到某一个列表的元素被指针指到头位置,最后进行比对和返回值(题目中的我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。指的是最后的区间有可能长度一样,但是指针的位置不一样,我们可以通过这个方法来计算出哪个才是真正的最小的区间) class Solution { public int[] smallestRange(List<List<Integer>> nums){ //定义一堆指针 int leftRange = 0; int rightRange = Integer.MAX_VALUE; int minRange = rightRange - leftRange; int max = Integer.MIN_VALUE; int size = nums.size(); int[] ptrs = new int[size]; //索引0,代表第一个列表,ptrs[0]=位置 PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){ public int compare(Integer index1,Integer index2){ return nums.get(index1).get(ptrs[index1]) - nums.get(index2).get(ptrs[index2]); //把所有指针所指位置最小的指针放到前面去 } }); for(int i = 0;i < ptrs.length;i++){ queue.offer(i); max=Math.max(max,nums.get(i).get(0)); } //取最大值 while(true){ int minIndex = queue.poll(); int curRange = max - nums.get(minIndex).get(ptrs[minIndex]); if(curRange < minRange){ minRange = curRange; leftRange = nums.get(minIndex).get(ptrs[minIndex]); rightRange = max; }//比较范围,更新边界 ptrs[minIndex]++; if(ptrs[minIndex] == nums.get(minIndex).size()){ break; } queue.offer(minIndex); //再找最大值循环 max = Math.max(max,nums.get(minIndex).get(ptrs[minIndex])); } //走完了之后返回 int[] result = new int[2]; result[0] = leftRange; result[1] = rightRange; return result; } } 运行截图: "},{"title":"力扣417.太平洋大西洋水流问题","date":"2021-08-24T15:00:00.000Z","url":"/2021/08/24/%E5%8A%9B%E6%89%A3417.%E5%A4%AA%E5%B9%B3%E6%B4%8B%E5%A4%A7%E8%A5%BF%E6%B4%8B%E6%B0%B4%E6%B5%81%E9%97%AE%E9%A2%98/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣417.太平洋大西洋水流问题题解 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。 规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。 请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。 提示: 输出坐标的顺序不重要m 和 n 都小于150 示例: 来源:力扣(LeetCode)链接: 看到上面的文本解释的时候直接一脸懵逼, 我们直接来看力扣给的示例 首先来看一下这个二维数组(代码有提现)的左下角,数字5 首先这个数字被打了括号,那么这个数字的位置就是题目中的“水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标”,看一下图中的箭头,左边是太平洋,下边是大西洋,这个5的位置和两大洋接壤,即可以流到两洋。 第一个区块解释完毕就可以大致看出来题目要求了,在看一下这个5旁边的1 可以理解为单元格想要满足同时流向两大洋的条件就是(不管具体路径)下一个格子必须比上一个格子的点数要小或者等于,才能判断为水流能流向,比如这个 这个位置的水流可以流到这几个位置上,所以这个位置是满足题目要求的 返回要求: 一看就是返回的数组位置咯 解题思路 我们可以把这个返回结果看成是把可以到达太平洋和可以到达大西洋的大陆板块取了交集,那么我们首先需要求出分别到达大西洋和太平洋的大陆板块,这两个过程又是一模一样,那么我们首先来求解到达大西洋的大陆板块。 我是用的是dfs算法,因为很明显用dfs可以轻易地逆推出结果,把结果打上标记 最后再来个数组遍历,就可以找到最后的结果了 那么直接来看代码 结果 "},{"title":"力扣13.罗马数字转整数","date":"2021-08-23T09:00:00.000Z","url":"/2021/08/23/%E5%8A%9B%E6%89%A313.%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97%E8%BD%AC%E6%95%B4%E6%95%B0/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣13.罗马数字转整数题解 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值I 1V 5X 10L 50C 100D 500M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。 示例 1: 输入: “III”输出: 3 示例 2: 输入: “IV”输出: 4 示例 3: 输入: “IX”输出: 9 示例 4: 输入: “LVIII”输出: 58解释: L = 50, V= 5, III = 3. 示例 5: 输入: “MCMXCIV”输出: 1994解释: M = 1000, CM = 900, XC = 90, IV = 4. 提示: 来源:力扣(LeetCode)链接: 可以说是一个新概念题目了,看懂这个数字的计算方式就能写出来题解 题目要求就是输入一堆罗马数字,输出数字, 其中规则可以理解为 我们只需要挨个提取数字进行比大小的判断然后分别做加减法就可以了 代码 结果 "},{"title":"力扣94. 二叉树的中序遍历","date":"2021-08-22T09:00:00.000Z","url":"/2021/08/22/%E5%8A%9B%E6%89%A394.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E4%B8%AD%E5%BA%8F%E9%81%8D%E5%8E%86/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣94. 二叉树的中序遍历题解 给定一个二叉树的根节点 root ,返回它的 中序 遍历。 示例 1: 输入:root = [1,null,2,3]输出:[1,3,2] 示例 2: 输入:root = []输出:[] 示例 3: 输入:root = [1]输出:[1] 示例 4: 输入:root = [1,2]输出:[2,1] 示例 5: 输入:root = [1,null,2]输出:[1,2] 提示: 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 来源:力扣(LeetCode)链接: 递归算法中序遍历,就是需要先遍历二叉树的左子树,然后访问根节点,最后遍历二叉树的右子树 左根右 那么前序遍历和后序遍历就是根左右和左右根,很简单的就懂了 递归写法 只有三步 第一步递归访问它的左子树,直到最后停止访问 第二步输出 第三步递归访问它的右子树 那么前序和后序遍历的过程只需要调换三条语句顺序即可 根据题意需要一个数组来返回,那么我们来封装一下这个函数 结果 迭代算法那么什么是迭代算法呢,迭代就是模拟递归的过程,显式的保存下来 怎么模拟递归?那么我们需要一个栈来保存运行时的上下文 拿到节点之后先存起来,访问左子树,指针指向左节点,访问到最后,走到尽头之后拿出之前存进去的节点,然后开始访问右节点,同理输出 因为涉及到栈,先进后出,后进先出,所以 代码如下 结果 "},{"title":"力扣70.爬楼梯","date":"2021-08-22T09:00:00.000Z","url":"/2021/08/22/%E5%8A%9B%E6%89%A370.%E7%88%AC%E6%A5%BC%E6%A2%AF/","tags":[["算法","/tags/%E7%AE%97%E6%B3%95/"]],"categories":[["算法解析","/categories/%E7%AE%97%E6%B3%95%E8%A7%A3%E6%9E%90/"]],"content":"力扣70. 爬楼梯题解 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 示例 2: 来源:力扣(LeetCode)链接: 首先看到爬楼梯那么解法第一个肯定就是递归(上次写过) so easy! 代码 结果 漂亮,超时了 那么就是我们在递归的过程中大量的重复运算了之前的数据,那我们可以用动态规划来优化 动态规划是什么?就是缓存了一堆数据的迭代,我们把之前计算过的结果缓存下来,就可以减少运算量 首先我们需要一个数组储存运算结果 代码 结果 "},{"title":"surface go 开箱测评","date":"2021-08-15T12:00:00.000Z","url":"/2021/08/15/surface%20go/","tags":[["摸鱼","/tags/%E6%91%B8%E9%B1%BC/"]],"categories":[["数码评测","/categories/%E6%95%B0%E7%A0%81%E8%AF%84%E6%B5%8B/"]],"content":"聊一聊我在生活中使用游戏本的一些感受 以及为什么买了一台配置“垃圾”的surface 观前提示 文章由我有感而发,全文皆为真实感受当然这台surface仅限于有主力机想要二奶机的人群使用我并不推荐购入,surface好用吗,好用,但是我不会推荐别人使用 现在本文章尚处于草稿阶段 初次相遇第一台电脑 高中毕业了之后买了2020款的拯救者R7000P,刚买回来感觉是真的香的不行,115W的RTX2060已经能够完全畅玩目前能够游玩的3A大作了,R74800H的CPU甚至日常开了一堆软件也只有20%不到的占用率.这有什么玩什么,完全不需要担心配置问题,年底还加装了1T的西数sn550,完全不需要为了储存不足担忧,但是后面的体验却和之前大相径庭。。。别急,听我细细道来(长图预警) (图图图图图待上传) 第一次我对游戏本的改观 刚拿到手的时候,感觉原来游戏本能做到怎么薄(我对游戏本的印象)其实游戏本也并没有那么厚,但是和轻薄本比肯定是要更加的厚重的,类肤质的塑料摸着手感很不错,键盘的键程也很好,除了稍微有点重以外,真的是我心目中最棒的笔记本了。 (图图图图图待上传) 但是。。。美好的印象总是短暂的,当天晚上11:00断电之后我才明白了游戏本的痛苦。因为本人特别喜欢文本视觉类游戏摊牌了就是galgame白天对于游戏本不重这个感觉变成了游戏本怎么能怎么重,想躺下玩游戏那只能侧着身子玩,把电脑侧放在床上,自己承受一点平衡力。而且游戏本可以说是离开了电源彻底歇菜,要是没插电的话只能玩玩好几年前的游戏或者看看视频,晚上玩游戏正到兴头呢,啪,很快啊,您的电脑电量不足10%,我直接原地升天。 (图图图图图待上传) 晚上11:00断电你还玩游戏?你这就是鸡蛋里挑骨头! 视觉小说嘛。。。懂的都懂,需要一个安静的环境,舍友晚上玩游戏大吼大叫的我也没办法,而且视觉小说一旦带入进去那个时间跑得飞快啊,哦对了游戏本风扇还会时不时来几圈 第二次我对游戏本的改观 不知不觉到了夏天,不知道是不是我岁数大了(应该并不是)我居然觉得背包里的笔记本电脑变得比以前重了,不对劲啊,因为毕竟大学生的书包应该只有几本书和电脑(大部分人是不带电脑的),反正就是总感觉电脑太沉了。 然后就到了带学生最难受的时候,大学考试周,(考试周破防,那几天我天天喝破防茶(热带风味冰红茶))那叫一个刺激啊,没上大学感觉那个”60分万岁,多一分浪费,少一分受罪”离我特别远,但是有些课吧让我考肯定稳过就是内心慌的一匹,为什么?因为大学几乎就没写过几道练习题,真的是纸上谈兵了,每次考试都是一次决定假期是否过的快乐的事情。虽然都是自己吓自己罢了,在考试周每天早起和同学一起去自习,由于我带的是游戏本,天天去教室找插座,那感觉简直了www。心里又累有无奈,因为总不能拿着手机学习吧(因为手机不方便) 最最最离谱的是,这鬼天气,一背上电脑出去,背上全都是汗!!!一天报废一件半袖,考试周自己又懒得洗,那个堆积量 (图图图图图待上传绝了.jpg) 决定购买一台平板 说起平板,那么久不得不说起一句非常经典的话了”买前生产力,买后爱奇艺”,我个人认为可能就是平板还不足矣担当为所谓生产力主要还是不是x86平台无法运行pc软件导致的,安卓和iOS平板==大号手机(除了剪辑视频可能有点用)所以我决定买一台搭载win10系统的平板电脑,所以我把眼光投向了巨硬家的surface系列。不看不知道,一看吓一跳,surface实在是太贵了吧,所以在同学的介绍下走了某海鲜市场平台入手了一台surface go(8+128G版本)带键盘1900元。严格意义上说surface属于电脑,但是如果有点电脑知识的话就会知道1900买笔记本的话体验肯定是非常糟糕的,类比到surface这种高度集成化的电子设备那体验肯定会更差一档,但是实际体验到底是怎么样呢,来看看我想要分享的实际感受 surface go初体验外观说实话这是我第一次购买二手电子产品,刚拿到手的时候心里很忐忑,开箱之后箱子里面有四样东西:surface go本体(带贴纸,后面撕了贴纸后后盖成色一般,并非全新),原装的一个品红色键盘,地摊货蓝牙鼠标(飘得不行),还有一个便宜货第三方富士通手写笔。总结一下就是键盘和电脑+两个电子垃圾(富士通那个笔并不支持压感和磁吸,所以就是个玩具)(图图图图图待上传) (图图图图图待上传) 有几处是后期补的漆,屏幕左上方有轻微划痕 外观就讲到这里,先开个机吧 系统这个就比较离谱了,surface go是出厂预装win10s模式的,但是我拿到手先重装系统( 然后一看系统???人有点傻,居然装的是win10专业版,这波血赚,可以用远程桌面和主力机互联了。 不得不吐槽一下win10的平板模式,这是平板了个寂寞吗?打开平板模式之后桌面会相当于自动打开了win的桌面磁铁,最下面导航栏甚至没有任何变化,退出还是需要和iPhone一样用手指点击左上角(右上角)的叉叉,手势的话还没有学习,反正真的是8行。还有这个防误触真的根本没用,应该说是win根本没有防误触,这时候边框停航母就真的巨有用(真的离谱,边框的实际用法是躺着握起来),香的不行 性能"},{"title":"关于我","date":"2020-09-03T09:00:00.000Z","url":"/2020/09/03/%E5%85%B3%E4%BA%8E/","tags":[["杂谈","/tags/%E6%9D%82%E8%B0%88/"],["摸鱼","/tags/%E6%91%B8%E9%B1%BC/"]],"categories":[["杂谈与闲聊","/categories/%E6%9D%82%E8%B0%88%E4%B8%8E%E9%97%B2%E8%81%8A/"]],"content":"在这里你可以了解一下本人是什么成分(bushi 某山里大学在读本科生,喜欢二次元的预备役格子衬衫程序猿一枚 喜欢二次元的都是可爱的男孩子吧(逃 最喜欢的事情就是和大家在一起 大水怪 摸鱼带师 上课压线怪 死宅(bushi 群里沙雕总负责人 乱点科技树越点越离谱的屑 不管在哪里都要戴耳机听歌(六亲不认) 呜呜呜别骂了,这就学习(指新建文件夹 明知道买智商税却打着用爱买单自欺欺人的阿宅 今天的风,甚是喧嚣呢~~"},{"title":"使用hexo搭建自己的博客及美化与上传Github","date":"2020-09-03T09:00:00.000Z","url":"/2020/09/03/hexo/","tags":[["摸鱼","/tags/%E6%91%B8%E9%B1%BC/"],["博客美化","/tags/%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%96/"]],"categories":[["环境搭建","/categories/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/"]],"content":"使用hexo搭建博客遇到了困难? 进来看看博客搭建的过程和如何能进一步稍作美化 搭建自己的博客及美化自己的博客这是我配好环境使用hexo写的第一篇博客 这里特别感谢各位大佬们的支持与帮助ε≡٩(๑>₃<)۶ 配置相关环境要想创建自己的hexo博客需要配置相关的环境(我前几次就经常把环境搞炸),接下来开始配置创建博客所必须的环境 过程来源: Gaein nidb,Code Sheep. 相关视频链接: 安装Node.js可以去 网址下载 选择左边LTS(长期支持版)下载,安装时无脑下一步即可 安装完成之后会有两个组件,如图所示 可以顺带检查一下它们俩的版本,按下键盘的win + R键,在弹出面板输入cmd,打开dos命令窗口。 输入 npm -v 和 code -v 我们需要利用npm安装镜像包,但是因为国内的下载速度比较慢,所以我们需要下载一个cnpm淘宝的源 在dos命令窗口中输入 如果安装成功,可以在dos命令窗口输入cnpm检查一下 然后使用cnpm安装hexo框架 在dos命令窗口输入cnpm install -g hexo-cli 如果安装成功,可以在dos命令窗口输入hexo -v检查一下 那么你的环境已经配置好了,我们来正式搭建hexo博客 在本地创建hexo的博客首先我们需要一个存放你博客的文件夹,所以第一步我们需要新建一个文件夹。 举个栗子:C:\\Users\\fiower\\Documents\\blog这是我的文件夹路径 我们终于可以创建自己的博客了(๑╹◡╹)ノ””” 由于本人没有用过powershell(菜),所以接下来我们使用dos命令窗口(git bash)创建本地博客 只需要两种方法选一即可(这里以dos命令窗口为例,git bash和dos命令窗口的指令是完全一样的,搭建时没必要纠结使用哪个) 使用dos命令窗口按下键盘的win + R键,在弹出面板输入cmd,打开dos命令窗口。 这时路径默认是C:\\Users\\你的用户名字> 输入cd 你的博客所在路径 转入你的博客路径 使用git bash在你的博客文件夹下按下右键,点击git bash 开始创建本地博客输入hexo init并按下回车等待 这时你的目标文件夹就会多出一些文件 那么恭喜你,现在hexo博客已经配置完毕了(bushi 继续在dos命令窗口输入hexo s并按下回车等待 如图所示,这时候出现了一个4000端口的网址 让我们在浏览器内打开这个网址 我们的第一个本地博客就搭建好了 但是你的程序还在运行着,这时候需要在dos窗口/git bash窗口中按下Ctrl + C键即可中断本地网址的建立(hexo s以后会用于博客写入新东西时的调试工作) 如果你没有成功到达这一步,不用害怕,只需要把你创建的文件夹****干掉重来****即可,多试试几次总会成功的 将hexo博客同步到远端(Github)我相信你已经非常兴奋而且想要把你的博客让朋友们看到,别急,现在我们就把自己的博客部署到远端 接下来我们要把自己的博客部署到Github上(毫无疑问需要你的账号,没有的小伙伴需注册) 新建一个仓库 *注意,用户部署个人博客的Github仓库的命名必须符合特定要求* *必须是”你的Github的昵称.github.io”* 建立了空仓库之后,我们需要装一个插件 在命令行中输入 然后用vscode打开你的blog的根目录_config.yml文件(没有安装vscode的话也可以选择记事本打开) 由于我没有新建空仓库,放一张CodeSheep的图片(这样获取你部署到远端的网址) 然后在dos命令窗口输入hexo d 这样你的hexo博客就部署到了远端(所有人都可以用这个网址访问你的博客了) 美化自己的hexo博客首先你需要下载一个博客的主题(如果你认为你的博客默认主题已经非常好看的了请忽略我说的话) 我们以ad主题为例 你需要先找见ad主题在github的网址,以便把这个主题克隆到自己的文件夹里面 ad主题地址: 然后我们需要在命令行中输入git clone themes/ad 这样就能把ad的主题文件克隆到你的themes文件夹里面了 用vscode打开你的blog的根目录_config.yml文件,修改themes: landscape为themes: ad 然后保存退出 在命令行输入hexo s进行调试,打开4000端口 (因为我没图片了就找我现在的充个数ヾ(o・ω・)ノ) 然后输入hexo clean清楚临时缓存的文件,输入hexo d部署到远端 这样我们的主题就修改好了 如何修改博客上的一些内容这里的内容指的是超链接,修改博客文字内容等操作,可以使你的博客更加个性化(也许(っ•̀ω•́)っ✎⁾⁾) 相信你已经发现了,blog的根目录_config.yml文件很重要,打开发现有很多设置的东西 其实你themes目录下的主题也有_config.yml文件,只要你打开它,我相信你就会知道怎么使用它了(确信) 如何在文章中加入超链接你可以使用Typora来写文章,可以直接使用超链接的格式,当然也可以用其他的软件来写(比如记事本) 格式:[你想写的内容]+(你想加入的链接) 这是基于markdown语法的格式,markdown格式的参考网址可以参考我在下文放出的链接 如何写文章及在写文章时加入图片我们只需在命令行输入hexo new “文章标题”就可以创建一个空文件夹了,然后可以打开改.md文件进行写入内容 那么问题来了,如何才能写出像我一样带有图片的文章呢? 我们需要再下载一个插件 我们需要打开git bash(dos也可以)输入 然后打开hexo的配置文件_config.yml 找到 post_asset_folder,把这个选项从false改成true 这样我们每次新建的文章都会带有一个同名的文件夹(原来的文件可以直接新建同名文件夹食用) 由于hexo文章是基于markdown语法写的,我们需要如何用markdown语法插入图片 参考网址: 格式:比如我这篇文章就是这样写的: 这样就可以在文章中间加入图片了qwq 如何写文章及在写文章时加入音乐播放器我相信有些人喜欢和我一样在博客中加入音乐播放器(显得有13格),所以和我一起在自己的博客中加入这个好玩的东西吧 由于是我自学的如何插入,本文只能简单的进行插入工作(菜) 原文链接 我接下来展示如何在ad主题下添加网易云音乐播放器 首先我们打开网页版网易云,选择一首你喜欢的歌曲 点击”生成外链播放器” 复制这个HTML代码 然后打开路径 themes\\ad\\layout\\partials下的head.ejs文件 (选择head是为了让播放器放到博客的左上角,当然我们也可以选择这个文件夹的任意文件进行修改) 加入这段代码 这样播放器就可以部署到你的博客里面了,但是我们还需要调一下css样式 打开路径 themes\\ad\\source\\css .header-music {margin-top: 80px; } 这样我们的播放器就可以部署到博客上了 如何写文章及在写文章时加入音乐播放器(升级版)由于我看了隔壁学长farewell的博客发现他的播放器和我上面配置的不一样(我的太菜了) 所以我决定我也要搞一个,但是这个过程并不顺利。。。经过我艰苦卓绝的努力,终于找到一个教程,现在用我的方法呈现出来 原文链接 Aplayer官网文档: Metingjs官网文档: 选项 | 默认 | 描述 || —- | —- | —- || | | || ————————— | ———– | ———————————————————— || ——— | —- | ——————– || | | || server(平台) | require | 音乐平台:netease,tencent,kugou,xiami,baidu || ———— | ———– | ——————————————————— || | | || id(编号) | require | 歌曲ID /播放列表ID /专辑ID /搜索关键字 || ——– | ———– | ————————————– || | | || auto(支持类种 类) | options | 音乐链接,支持:netease,tencent,xiami || ——————- | ——- | ——————————————— || | | || type(类型) | require | song,playlist,album,search,artist || ———— | ———– | ———————————————– || | | || fixed(固定模式) | false | 启用固定模式,默认false || —————– | ——- | ————————- || | | || mini(迷你模式) | false | 启用迷你模式,默认false || —————- | ——- | ———————— || | | || autoplay(自动播放) | false | 音频自动播放,默认false || ——————– | ——- | ————————- || | | || theme(主题颜色) | #2980b9 | 默认#2980b9 || ————— | ——— | ————- || | | || loop(循环) | all | 播放器循环播放,值:“all”,one”,“none” || ———— | —– | ————————————— || | | || order(顺序) | list | 播放器播放顺序,值:“list”,“random” || ———– | —— | ———————————— || | | || preload(加载) | auto | 值:“none”,“metadata”,“’auto” || ————- | —— | ——————————- || | | || volume(声量) | 0.7 | 默认音量,请注意播放器会记住用户设置,用户自己设置音量后默认音量将不起作用 || ————– | —– | ———————————————————— || | | || mutex(限制) | true | 防止同时播放多个玩家,在该玩家开始播放时暂停其他玩家 || ————- | —— | —————————————————- || | | || lrc-type(歌词) | 0 | 歌词显示 || —————- | —- | ——– || | | || list-folded(列表折叠) | false | 指示列表是否应该首先折叠 || ———————– | ——- | ———————— || | | || list-max-height(最大高度) | 340px | 列出最大高度 || ————————— | ——- | ———— || | | || storage-name(储存名称) | metingjs | 存储播放器设置的localStorage键 || ———————— | ———- | —————————— || | | | 然后在你博客的适当位置加入以下代码 适当位置指的是你博客的主界面的文件中的位置,举个栗子 选择themes\\ad\\layout\\partials\\footer.ejs(因为我使用的ad主题,所以这里以ad主题为例,若使用其他主题,只需要点开对应主题的.ejs文件) 然后在适当位置加入代码(该代码在文件中的位置直接对应到播放器在你的博客页面的位置) 比如我的就是在这里加的 需要注意的是,你这样拷贝的是我的播放器列表(当然用我的歌单我将感激不尽),我相信你肯定想拥有一个属于自己的播放列表 这里就拿网易云音乐举例,仔细看上面的代码 我相信你如果仔细看过上面的表格的话一定知道我想表达什么了(可能) 你首先需要选择你需要播放的音乐平台,比如你想使用网易云,就在data-serve后面输入netease,你想使用qq音乐,就在data-serve后面输入tencent,以此类推。。。 不管你是哪个平台的忠实听众,你的每个歌单都有属于它自己的id,你需要的是把这个id找到然后cv到你的data-id上 接下来让我们看看这么才能找到你歌单的id 首先打开网页版的网易云音乐,然后登陆,找到自己的歌单 看见最上方链接的那一串数字了没?那就是我们想要的东西 赶快cv一下,然后粘贴替换掉上面我的id(悲) 然后你的这段代码就是你自己的了,赶快hexo s试一试 该播放器的更多使用方法在上方表格内都写出来了,如果看见代码里面没有的但是表格中确实有使用方法的,可以手动添加,在代码末端加入 这样达到你需要的目的,其他选项可以自行修改,更多使用方法请自行尝试(因为那些也就改几个字的事情,没必要教) emmmmm其实有的主题在主题对应的_config.yml文件中就已经配置好了 如何在博客中加入live_2d看板娘因为我还没有学过HTML的用法,所以我只能部署一个比较简单的live_2d看板娘 在命令行输入 安装 但是这个live2d的插件真的一言难尽 (我和学长一致认为这个live2d插件自带的人物很少(且不对我xp)且不能自行添加) 安装截图我就不放了,毕竟能看到这里的都安装过不下10次了吧( 安装好了之后就可以去下载live2d文件了(其实你也可以边等边下载的) 下载地址: 下载的文件是文件夹格式的,我们需要把它们移到()文件路径中 然后你还需要再次修改根目录中的_config.yml文件,修改代码 原文章代码 如图所示 () 然后你就可以在命令行中输入hexo s来进行本地调试了 选择一个你喜欢的live_2d吧ヾ(๑╹◡╹)ノ” 未完待续"}]