因为时间的问题,所以复习和平时的学习方法还是有些区别,针对不同的科目的复习方法也有所不同,选择好的复习方法才能事半功倍。

阅读全文 »

接雨水II是对接雨水I的拓展,将一维数组扩展到了二维矩阵,之前接雨水I中的动态规划、单调栈以及双指针在这里都不起作用,但是在我之前介绍接雨水I的文章中对双指针进行了分析和延伸,延伸出的更通用的解法即优先队列解法则可以轻易地移植到接雨水II中。

阅读全文 »

来源:力扣

题目描述

给你两个下标从 0 开始 的整数数组 serverstasks ,长度分别为 n​​​​​​ 和 m​​​​​​ 。servers[i] 是第 i​​​​​​​​​​ 台服务器的权重 ,而 tasks[j] 是处理第 j​​​​​​ 项任务所需要的时间(单位:秒)。

你正在运行一个仿真系统,在处理完所有任务后,该系统将会关闭。每台服务器只能同时处理一项任务。第 0 项任务在第 0 秒可以开始处理,相应地,第 j 项任务在第 j 秒可以开始处理。处理第 j 项任务时,你需要为它分配一台 权重最小 的空闲服务器。如果存在多台相同权重的空闲服务器,请选择 下标最小 的服务器。如果一台空闲服务器在第 t 秒分配到第 j 项任务,那么在 t + tasks[j] 时它将恢复空闲状态。

如果没有空闲服务器,则必须等待,直到出现一台空闲服务器,并 尽可能早 地处理剩余任务。 如果有多项任务等待分配,则按照 下标递增 的顺序完成分配。

如果同一时刻存在多台空闲服务器,可以同时将多项任务分别分配给它们。

构建长度为 m 的答案数组 ans ,其中 ans[j] 是第 j 项任务分配的服务器的下标。

返回答案数组 ans​​​​ 。

阅读全文 »

接雨水I算是Leetcode上比较经典而且有意思的题了,解法也有挺多的,有官方题解介绍的动态规划、单调栈、双指针,还有我补充的堆解法,这篇文章不是搬运文,而是对官方题解的补充,而且将接雨水II的解法移植到了接雨水I中,展示了更通用的这类题型的解法和思路。

阅读全文 »

字典树/前缀树 Trie

前缀树是一种树结构,当一系列单词有很多公共前缀时就可以用前缀树来存储和查询,如果这些单词没有公共前缀,那么和用数组存是一样的。因为前缀树中节点通常用字典(Python中的dict,C++中的map)这个数据结构来存储子节点,所以常被称为字典树。前缀树是一种空间换时间的思想,这个和哈希表还有动态规划是一样的。

前缀树常常被用于基于前缀的模糊匹配,但其不局限于存储单词,树中的节点可以是任意的数据类型或者结构,比如前缀树会被用来解决最大异或值的问题,这时前缀树为二叉树,节点的值为0或者1。

前缀树只能用作基于前缀的模糊匹配,如果要做到匹配字符串中的某一段则要借助基于前缀树的AC自动机了,AC自动机融合了前缀树和KMP算法的思想。

阅读全文 »

参考《程序员面试指南:IT名企算法于数据结构题目最优解(第2版)》

双端队列deque

普通的队列是先入先出FIFO(First In First Out),只能从队尾添加元素,从队首弹出元素。而双端队列则是从队尾添加元素,但是既可以从队首弹出元素,和普通的队列一样,也可以和栈一样从队尾弹出元素,所以叫双端队列deque(double-ended queue),它同时具备队列(FIFO)和栈(LIFO)的特性。

阅读全文 »

参考《程序员面试指南:IT名企算法于数据结构题目最优解(第2版)》

单调栈

单调栈是一种从栈顶到栈底单调递增单调递减的栈。
它常用于解决离某位置最近的最大或者最小值这种问题。

阅读全文 »

背景

关于Hexo Next主题添加canvas_nest动画背景网上有很教程,但是他们的第一个条件我就没满足——将next/_config.yml中的canvas_nest改为true,而我的_config.yml中压根没这一项,而且我的hexo和next版本都是很新的,所以看着这些教程感觉很无奈,为啥别人默认都有这一项,难道我安装了个假next?
不过我还没有放弃,终于让我在github中找到解决办法,而且非常简单。

阅读全文 »

参考了《人人都懂设计模式:从生活中领悟设计模式(Python实现)》

Ensure a class has only one instance, and provide a global point of access to it.
确保一个类只有一个实例,并且提供一个访问它的全局方法。

应用场景

  1. 你希望这个类有且只能有一个实例;
  2. 项目中的一些全局管理类。
    阅读全文 »

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。算法要求所有边的权重必须是非负的。

阅读全文 »

来源:力扣

给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

阅读全文 »

来源:力扣

在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1n )。有的房子去年夏天已经涂过颜色了,所以这些房子不需要被重新涂色。

我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。)

给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target ,其中:

houses[i]:是第 i 个房子的颜色,0 表示这个房子还没有被涂色。
cost[i][j]:是将第 i 个房子涂成颜色 j+1 的花费。
请你返回房子涂色方案的最小总花费,使得每个房子都被涂色后,恰好组成 target 个街区。如果没有可用的涂色方案,请返回 -1

阅读全文 »

题目:

有一个刺客接了一个杀死怪物的任务,他有一把剑,耐久度为m,怪物一共有n个,它们分为两种,一种是不带剑的空手怪物,一种是带剑的怪物,不同的怪物有不同的血量,血量和刺客佩剑的耐久度对应,即杀死a点血的怪物需要消耗a点耐久度。如果杀死带剑的怪物,则可以拿走怪物的剑,怪物的剑比较特殊,它可以无视血量杀死任何一只怪物并且不损失刺客自己剑的耐久度,但是每杀死一个怪物它就会少一点耐久度,耐久度为0则报废。
该刺客对自己的要求很高,要求自己在能杀死更多的怪物的前提下,保证自己佩剑消耗的耐久度最低。

阅读全文 »