自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(198)
  • 收藏
  • 关注

原创 LeetCode热题HOT-100 刷题记录

LeetCode 热题 Hot 100 😍😍😍

2022-03-30 20:27:54 392

原创 剑指offer(专项突破版):数据结构与算法名企面试题精讲 刷题记录

自己记录的刷题笔记

2021-10-13 11:01:15 1285

原创 C语言实现教学计划编制问题(图的拓扑排序)

[问题描述]大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等,每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。[基本要求](1)输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。(2)允许用户指定下列两种编排策略之一:一是使学生在

2020-08-02 18:06:52 18002 59

原创 MIT 6.5840-分布式系统 Lab2

如何保证只执行一次每次请求时携带一个token,用于标识请求// DoOnce 每次请求时携带// 标识本次请求// GetToken 获取本次请求的标识符server记录所有的token,对于put和append,先校验token是否存在,如果已存在,就不要再修改如何确保相同append请求的返回值一致。

2024-04-05 19:59:08 962 2

原创 MIT 6.5840-分布式系统 Lab1(chan-version)

通过查看https://github.com/OneSizeFitsQuorum/MIT6.824-2021/blob/master/docs/lab1.md了解到,还可以不用mutex,只用chan实现,思路总结为什么可以用channel:此前使用mutex确保了某一时刻只有一个协程访问缓冲区数据,chan版本只有后台gouroutine才能访问核心数据,这样就避免了racenReduce int // map任务输出文件数量Status TaskStatus // Coordinator的状态。

2024-03-23 20:00:35 751

原创 MIT 6.5840-分布式系统 Lab1

MapReduce是一种用于处理和生成大规模数据的一种算法模型。对于输入数据, 用户指定一种 MapFunc 则可以生成一个个键值对(称作 intermediate) , 这一过程被叫做 Map。对于Intermediate, 用户指定一种 Reduce Function,则可以根据Intermediate 的 key 对Intermediate 进行合并归类, 这一过程被叫做 Reduce注意点:每个map任务会输出多个文件,每个文件中的intermediate经过hash函数取余后值是一样的。

2024-03-17 21:46:59 1294

原创 2024 MIT 6.5840-分布式系统学习记录

课程安排2023 MIT 6.5840 分布式系统 | 环境搭建与 Lab 1 MapReduce - 知乎 (zhihu.com)

2024-03-17 21:45:32 847

原创 Java 动态绑定

有关Java动态绑定以及Override Overload的理解~

2022-06-05 23:54:26 264

原创 每日学习记录帖

每日一题记录贴~

2022-05-10 23:05:33 331 2

原创 剑指offer 专项突破版 119、最长连续序列

题目链接思路同样的可以转化为并查集来做,可以把相邻的数字放到一个子集中,每当搜索到一个数字时就判断和他相邻的数字是否在集合中,如果在就合并,为了方便记录每个集合的大小,可以用一个count集合记录每个子集的大小,在合并集合的时候也要更新count数组。这个题需要注意的就是并查集的另一种使用方式:首先把所有数字放入allNum中,同时初始化fathers集合和count集合然后遍历每一个allNum中的数字,对于每个数字都判断一下相邻的数字是否在集合中,如果在的话就进行合并处理最后找出最大集合元

2022-05-10 22:48:54 339

原创 剑指offer 专项突破版 118、多余的边

题目链接思路这个题是要找处于环的边,可以转化为用并查集处理的问题首先把所有结点初始化,每个人的根节点都是自己每遍历一个边就合并两个子集如果遍历到某一个边,发现合并前二者就是一个子集(也就是union函数返回false),那么这个边就是最后一个环的边,也就是我们要找的多余的边class Solution { public int[] findRedundantConnection(int[][] edges) { int n = edges.length; int[

2022-05-10 22:48:16 978

原创 剑指offer 专项突破版 117、相似的字符串

题目链接思路这道题和上题有点类似,代码主题框架相同,并不需要像拓扑排序那样,先建图注意看主题框架类似邻接矩阵!还有就是注意如何判断两个字符串是不是相似的,因为题目中说了所有的字符串都是变位词,所以我们可以遍历一遍两个字符串,遇到不一样的字符就+1,最后如果不相同的字符串<=2 那么就说明是相似的class Solution { public int numSimilarGroups(String[] strs) { int[] fathers = new int[

2022-05-08 21:22:41 1013

原创 剑指offer 专项突破版 116、省份数量

题目链接思路对于这种图的分类问题是经典的并查集的运用并查集的关键在于两个函数 findFather用来寻找根节点并更新,union用来判断是否需要把两个结点合二为一注意union函数中后面的更新的是fathers[fatherOfI]class Solution { public int findCircleNum(int[][] isConnected) { int[] fathers = new int[isConnected.length]; fo

2022-05-08 21:22:11 266

原创 剑指offer 专项突破版 115、重建序列

题目链接思路这个题注意,图的结点应该是后面的序列中出现的所有的字符!还有一点在于,对于某个序列[1,2,3],我们只需要创建1指向2的弧,2指向3的弧即可,并不需要创建1指向3的弧,尽管1的优先级比3高,但是只要建立了1->2的弧,那么就可以保证1不出去,3也绝对出不去!至于如何判断是否只有一种拓扑排序的结果,只要每次都判断一下,此时队列里是不是只有一个元素!最后注意一下判断数组相等的APIArrays.equals(orgs,build.stream().mapToInt(e-&gt

2022-05-08 21:11:35 331

原创 剑指offer 专项突破版 114、外星文字典

题目链接思路这种题目难点就两个 抽象为图并构建邻接表、拓扑排序首先我们可以确定的是所有出现的字符是图中的结点,如果某个字符ch1优先级大于ch2,那么就应该存在一条ch1指向ch2的弧我们可以根据words数组中的顺序找到单词的优先级关系,因为单词是字典序,所以只需要找到前后两个字母第一个不一样的字符 那么必然有前面的字符优先级高于后面的字符。但是有两种特殊情况,如果前面是后面的子串,那么自然找不到不一样的字符,如果后面是前面的子串,那么排序是错误的。需要注意的是 某个单词如gril,字符之间并

2022-05-08 21:10:52 500

原创 剑指offer 专项突破版 113、课程顺序

题目链接思路大一就做过的经典拓扑排序的题目~关于拓扑排序有两点应该注意的。首先是图的建立。一般是用邻接表表示,对应着Map。与此同时在建立图的过程中找到每个结点的入度值,可以用数组也可以用Map。还有就是在建立图之前要先在Map中创建对应的结点然后是拓扑排序的过程,拓扑排序我们是使用BFS来完成的,首先建一个队,然后把所有入度为0的结点放入。后续就不断取出队列的元素,然后利用邻接表更新入度表,遇到入度为0的结点就再次入队,直至队空class Solution { public int[

2022-05-08 21:10:20 467

原创 剑指offer 专项突破版 112、最长递增路径

题目链接思路之前在做dp的题目时有一种做法是从大到小递归地计算,同时用一个数组保存状态,此题正是运用了这个思路,因为某个结点的最大递增路径就是1+和他相邻的比他大的结点的最大路径注意递归函数maxAscLength返回坐标为i,j结点的最大递增路径的值并进行填充class Solution { public int longestIncreasingPath(int[][] matrix) { int max = 1; int[][] maxPath = new in

2022-05-08 21:09:48 274

原创 剑指offer 专项突破版 111、计算除法

题目链接思路这个题可以看作一个寻找路径的问题~我们把所有出现的数字看作一个结点 那么这道题算除法就是让我们找到两个结点间的路径积是多少 而且有向图的边是有权重的,因此可以看作一个有向网~注意两个结点 如果E(a,b) = m 则E(b,a) = 1/m还有一点在于 E(a,b)表示a/b,如果我们要找a/c 我们可以找到a/b,然后再找到b/c,这两个结果应该做乘法,所以求的是路径积最后是如何表示图?我们可以用一个Map来表示结点和边的映射,具体的value还是一个Map,是临近节点和权重的映

2022-05-03 23:43:17 253

原创 剑指offer 专项突破版 110、所有路径

题目链接思路一般这种所有路径问题,适合用DFS因为这个是有向图且不存在环 所以不需要visited集合!PS: 我倒认为这个更像回溯~class Solution { List<List<Integer>> result; public List<List<Integer>> allPathsSourceTarget(int[][] graph) { result = new ArrayList<>();

2022-05-03 23:42:41 317

原创 剑指offer 专项突破版 109、开密码锁

题目链接思路这个题目和上一个题目有点类似,只不过上一个题的路径中的结点是已经的,所以我们可以有一个notVisited集合,但是这个题目的路径未知,为了不重复遍历,必须要设置一个visited集合最重要的一点在于,通过函数生成相邻结点时,不需要考虑是否visited过,因为在双向奔赴的过程中,如果某一个结点v在set2中,那么他肯定存在于visited集合中,如果因为这个而不把他加到相邻结点中,那么就永远也找不到set1中的元素出现在set2中的情况!所以总而言之,还是要返回所有的临近结点~c

2022-05-03 23:42:10 219

原创 剑指offer 专项突破版 108、单词演变

题目链接思路这种可以抽象成最短路径问题 每个单词是一个结点,如果两个单词只有一个字母的差距,那么他们之间有一条边,最终的目的是寻找开始单词和结束单词的最短路径因此这个题可以用BFS来解决 通过用队列辅助BFS 每一轮遍历结束后都给count++ 这样直到某一次队列中出现了target,就算是最终找到了因此我们可以用一个函数来获取某个单词可以转换为的所有的单词,也就是说在获取所有和该结点相邻的结点,注意这个函数要返回所有相邻的结点,不管是否遍历过class Solution { publ

2022-05-03 23:41:31 217

原创 剑指offer 专项突破版 107、矩阵中的距离

题目链接思路一般而言找最短距离 要先考虑BFS这道题应该是0找1首先我们把所有的0顶点放入队列 然后依次出队 把所有相邻的1顶点放入另一个队列那么此时第二个队列的所有的顶点距离都是1 然后再把和第二个队列相邻的所有的1顶点放入第三个队列。。。注意要放入队列还有一个条件 就是我们如果成功通过0顶点更新了1顶点的距离的话 那就把改1顶点放入队列if(result[pos[0]][pos[1]] + 1 < result[x][y]){ result[x][y] = result[

2022-05-03 23:40:44 209

原创 剑指offer 专项突破版 106、二分图

题目链接思路这个题仍然是注意思路,把二分图转化为给顶点涂色如果每一条边所依附的两个顶点都是不同的颜色 那么他就是一个二分图所以我们的搜索模板 最外层是遍历所有的顶点 如果该顶点尚未上色 就调用辅助函数对于辅助函数 我们先给该顶点上色 然后依次处理和该顶点相邻的所有顶点如果相邻的顶点涂色了 判断是否和当前顶点颜色相反如果没有涂色 那就对该顶点递归调用辅助函数递归class Solution { public boolean isBipartite(int[][] graph

2022-05-03 23:40:12 370

原创 剑指offer 专项突破版 105、岛屿的最大面积

题目链接思路这个题就是搜索 不管是dfs或者是bfs都可 反正搜索最多相邻的1的个数就好 主要就是熟悉一下模板首先最外层一个循环 遍历所有结点,如果该节点没有被遍历过,那就调用辅助函数还需要学习的是这种迷宫走法 如何快速用代码实现BFS 用队列~class Solution { int max; int[][] grid; boolean[][] isVisited; public int maxAreaOfIsland(int[][] grid) {

2022-05-03 23:39:40 249

原创 剑指offer 专项突破版 104、排列的数目

题目链接思路完全背包问题(可以重复选择) 思路和上一道题类似~设f(i)为用数组所有元素凑成i的可能的数目,那么有f(i) = Σ f(i-nums[j]),比如数组元素为[1,2,3] 需要凑8,那么某一步需要求f(5),也就是说凑成5的可能的数目。那么这个可能的总数有三种 先凑4再加上1,先凑3再加上2,先凑2再加上3。所以凑成和为5的可能数目就是上述三个数目的和边界情况 f(0) = 1 于此同时还有凑不成的情况 所以我们最初可以把数组所有元素初始化为0class Solution {

2022-04-28 22:21:14 266

原创 剑指offer 专项突破版 103、最少的硬币数目

题目链接思路这种题目可以无限选择,属于课重复选择的背包问题可以令f(i)为凑成面值i所需要的最少硬币数,那么f(i)可以是f(i-coins[0])+1,也就是说在凑成面值为i-coins[0]的基础上再加1枚硬币,也可以是是f(i-coins[1])+1,也就是说在凑成面值为i-coins[1]的基础上再加1枚硬币所以说 f(i) = min{f(i-coin)+1}边界条件 f(0) = 0,当目标数值是0时0枚硬币就可以还有一点在于初始化的值,把数组每个元素都初始化为amount+1 这

2022-04-28 22:20:39 278

原创 剑指offer 专项突破版 102、加减的目标值

题目链接思路这个题目首先在于转化,把题目转化为从数组中选出一些数,使他们的和为 sum+target >> 1设f(i,j)为前i个元素可以选出和为j的子元素的选法如果不选择第i个 f(i,j) = f(i-1,j)如果选择第i个 f(i,j) = f(i-1,j-nums[j])class Solution { public int findTargetSumWays(int[] nums, int target) { int su

2022-04-28 10:30:58 184

原创 剑指offer 专项突破版 101、分割等和子集

题目链接思路这个题本质就是问能否选择部分元素元素使其和为数组元素总和的一半,所以设f(i,j)为能否从前i个元素中挑选出和为j的部分元素,那么状态转移方程为如果选择了nums[i] f(i,j) = f(i-1,j-nums[i]) 也就是说,如果选择当前值nums[i] 那么能否选出和为j的元素,取决于前i-1个元素能否选出和为j-nums[i]的元素如果不选择nums[i] f(i,j) = f(i-1,j) 这代表不选择当前值nums[i]的话 能否选出和为j的元素,取决于前i-1个元素能

2022-04-28 10:30:26 208

原创 剑指offer 专项突破版 100、三角形中最小路径之和

题目链接思路这个题就是要区分一下边界数字和非边界数字边界数字的最大值只能是上一个边界+cost[i]但是非边界的数字可以是上一行相邻数字的最小值+cost[i]class Solution { public int minimumTotal(List<List<Integer>> triangle) { List<Integer> dp = triangle.get(0); for(int i = 1 ; i < tria

2022-04-28 10:29:54 110

原创 剑指offer 专项突破版 99、最小路径之和

题目链接思路这道题和上到题类似,设f(i,j)为从原点走到坐标为(i,j)的地点的最小路径因此有f(i,j)=min{f(i-1,j),f(i,j-1)}+cost(i,j)对于边界值,就是从开头到现在的累加和同样可以用一个数组保存~class Solution { public int minPathSum(int[][] grid) { int[] dp = new int[grid[0].length]; dp[0] = grid[0][0];

2022-04-27 00:01:52 108

原创 剑指offer 专项突破版 98、路径的数目

题目链接思路这种路径类题一般是用f(i,j)代表走到了坐标为(i,j)的位置这个题可以设f(i,j)代表从原点走到坐标为(i,j)位置的路径的条数因此f(i,j) = f(i-1,j) + f(i,j-1)对于边界值 f(0,j) f(i,0)都只能一条路走到黑 所以都是1这道题注意的点在于 我们可以状态压缩到用一维数组解决~ 此前都是用两行 但是其实可以更节约 用一行即可我们假设这一行在更新前存储的是f(i-1,j)的值,且我们要从左到右填充~在计算f(i,j)时,需要用到的是f(i-1

2022-04-27 00:01:18 1132

原创 剑指offer 专项突破版 96、字符串交织

题目链接题目链接这道题令f(i,j)是一个布尔值,代表s1前i个字符、s2前j个字符能不能交织成s3的前i+j+1个字符(都是从0开始索引的)首先找递推关系,令ch1 = s1.charAt(i) , ch2 = s2.charAt(j) , ch3 = s3.charAt(i+j+1);如果ch1=ch2 f(i,j)=f(i-1,j) 也就是说本次能否交织成功取决于s1前i-1个字符、s2前j个字符能不能交织成s3的前i+j个字符如果ch3=ch2 f(i,j)=f(i,j-1) 解释同上

2022-04-27 00:00:45 848

原创 剑指offer 专项突破版 97、子序列的数目

题目链接思路设f(i,j)是t的前j个字符在s前i个字符中出现的次数如果s[i]=t[i] 那么在选择子串的时候,可以用s[i]去匹配t[i] (此时f(i,j)=f(i-1,j-1)),也可以不用s[i]去匹配t[i] (此时f(i,j)=f(i-1,j))如果s[i]!=t[i] 那么s[i]并不能去匹配t[i] 此时f(i,j)=f(i-1,j)所以状态转移方程为f(i,j) = f(i-1,j-1) + f(i-1,j) 相等f(i,j) =f(i-1,j) 不等注意边界

2022-04-27 00:00:08 201

原创 剑指offer 专项突破版 95、最长公共子序列

题目链接思路这道题前面都是做的单序列的题目,也就是说输入的内容是一个数组或者是字符串。现在以及后面的几道题都是双序列,也就是说要处理的数据有两个数组或者字符串,对于双序列的题目,一般的状态转移方程有两个参数,因此我们需要找到f(i,j)和f(i-1,j-1)、f(i-1,j)、f(i,j-1)的关系假设f(i,j)是s1的前i个字符和s2的前j个字符可以形成的最大公共序列,那么最终的结果即为求f(s1.length(),s2.length())首先找递推关系(这里书上讲的很清楚)如果chi =

2022-04-26 23:59:17 160

原创 剑指offer 专项突破版 94、最少回文分割

题目链接思路我们设f(i)代表把前i个子串全部分为回文的最小分隔次数,那么便有f(i) = min{f(j)+1} 其中0<= j <=i 且f(j)为回文当然还有个特例就是如果[0,i-1]自己就是一个回文子串 那么f(i)=0因为每次都要判断任意两个子串是不是回文,因此我们可以提前处理以下,用二位数组isPal记录某子串S[i,j]是不是回文class Solution { public int minCut(String s) { // 提前

2022-04-26 23:58:45 334

原创 剑指offer 专项突破版 93、最长斐波那契数列

题目链接思路假设f(i,j)代表以A[j]为最后一个数字,A[i]为倒数第二个数字的斐波那契数列的长度,那么如果有A[k]使得A[k] + A[j] = A[i],就可以得到f(i,j)=f(j,k)+1所以可以用二重循环来实现 但是有几点需要注意对于任意两个索引ij(i>j),都有f(i,j)=2,因为他们两个的子串长度是2对于某个确定的A[i] A[j] 当我们想快速找到数组中是否存在A[k]时可以先把数组所有元素放入哈希表(val:index),这样就可以在O(1)的时间内找到某元

2022-04-21 23:59:33 169

原创 剑指offer 专项突破版 92、翻转字符

题目链接思路假设f(i)为前i个字符有序的最小翻转数,那么f(i)和f(i-1)的数目关系要分情况讨论,如果f(i-1)以0结尾,那么f(i)可以以0结尾,也可以以1结尾;相反,如果f(i-1)以1结尾,那么f(i)必须以1结尾因此可以假设f(i)为前i个字符有序且以1结尾的最小翻转数、g(i)为前i个字符有序且以0结尾的最小翻转数那么状态转换方程为:s[i] = 1 时 g(i)=g(i-1)+1 f(i)=min{f(i-1),g(i-1)}s[i] = 0 时 g(i)=g(i-1)

2022-04-21 23:58:53 147

原创 剑指offer 专项突破版 91、粉刷房子

题目链接思路设dp[i][j]是第i个房子刷第j个颜色时总共需要花费的价格,那么自然有 dp[i][j] = min{dp[i-1][(j+1)%3],dp[i-1][(j+2)%3]} + cost[i]也就是说 dp[i][j]应该为前一个房子染另外两个颜色的最小值加上这个房子染颜色j的花费class Solution { public int minCost(int[][] costs) { int[][] dp = new int[2][3]; S

2022-04-21 23:57:52 131

原创 剑指offer 专项突破版 90、环形房屋偷盗

题目链接思路注意这道题有一个条件是首位不能连续被偷,可以转化为 先求[0,length-2]的最大值,然后再求[1,length-1]的最大值然后二者之中最大值为最后的结果helper函数的参数为数组的起始、结束位置。也就是表明具体在偷窃哪些房屋。需要注意的是此前在空间复杂度为O(1)的做法时,判断i、i-1、i-2的索引是通过i%2,(i-1)%2,(i-2)%2来判断的。但是这道题,我们把起始房间的索引变成1时,因为此时f(1)被放到了dp[0]的位置,所以f(i)应该放入的索引应该是 (i-

2022-04-20 21:26:10 209

原创 剑指offer 专项突破版 89、房屋偷盗

题目链接思路假设dp[i]为到第i个房间偷窃的最大值,那么有dp[i] = max{dp[i-1],dp[i-2] + nums[i]}注意i在数组的索引为 i % 2class Solution { public int rob(int[] nums) { if (nums.length < 2) return nums[0]; int[] dp = new int[]{nums[0], Math.max(nums[0],

2022-04-20 21:25:39 173

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除