每周有营养的大厂算法面试题 第001节 2021年11月第4周流行算法题目解析 给定一棵多叉树的头节点head,每个节点只有黑白两色 所有黑节点都保留,所有从头节点到黑节点路径上的点都保留 返回处理后树的头节点 我们正在玩一个猜数游戏,游戏规则如下: 我从 1 到 n 之间选择一个数字。 你来猜我选了哪个数字。 如果你猜到正确的数字,就会 赢得游戏 。 如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。 每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。 如果你花光了钱,就会 输掉游戏 。 给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。 Leetcode链接 : https://leetcode.com/problems/guess-number-higher-or-lower-ii/ 来自真实面试,同学给我的问题 限制:0 <= start <= end,0 <= target <= 64 [start,end]范围上的数字,有多少数字二进制中1的个数等于target 第002节 2021年12月第1周流行算法题目解析 int n, int[][] roads, int x, int y n表示城市数量,城市编号0~n-1 roads[i][j] == distance,表示城市i到城市j距离为distance(无向图) 求城市x到城市y的最短距离 一开始屏幕上什么也没有,粘贴板里什么也没有, 你只能在键盘上做如下4种操作中的1种: 输入:在屏幕上已经显示内容的后面加一个A 全选:把屏幕上已经显示的全部内容选中 复制:被选中的内容复制进粘贴板 粘贴:在屏幕上已经显示内容的后面添加粘贴板里的内容 给定一个正数n,表示你能操作的步数, 返回n步内你能让最多多少个A显示在屏幕上 Leetcode链接 : https://leetcode.com/problems/4-keys-keyboard/ 给定一棵树的头节点head,原本是一棵正常的树 现在,在树上多加了一条冗余的边 请找到这条冗余的边并返回 Leetcode链接 : https://leetcode.com/problems/redundant-connection-ii/ 第003节 2021年12月第2周流行算法题目解析 给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号。 另外给一个下标从 0 开始的二维整数数组 meetings , 其中 meetings[i] = [xi, yi, timei] 表示专家 xi 和专家 yi 在时间 timei 要开一场会。 一个专家可以同时参加 多场会议 。最后,给你一个整数 firstPerson 。 专家 0 有一个 秘密 ,最初,他在时间 0 将这个秘密分享给了专家 firstPerson 。 这个秘密会在每次有知晓这个秘密的专家参加会议时进行传播。更正式的表达是,每次会议, 如果专家 xi 在时间 timei 时知晓这个秘密,那么他将会与专家 yi 分享这个秘密,反之亦然。 秘密共享是 瞬时发生 的。也就是说,在同一时间,一个专家不光可以接收到秘密,还能在其他会议上与其他专家分享。 在所有会议都结束之后,返回所有知晓这个秘密的专家列表。你可以按 任何顺序 返回答案。 Leetcode链接 : https://leetcode.com/problems/find-all-people-with-secret/ 来自美团 所有黑洞的中心点记录在holes数组里 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9) 并且所有黑洞的中心点都在左下角(0,0),右上角(x,y)的区域里 飞船一旦开始进入黑洞,就会被吸进黑洞里 返回如果统一所有黑洞的半径,最大半径是多少, 依然能保证飞船从(0,0)能到达(x,y) arr数组长度为n, magic数组长度为m 比如 arr = { 3, 1, 4, 5, 7 },如果完全不改变arr中的值, 那么收益就是累加和 = 3 + 1 + 4 + 5 + 7 = 20 magics[i] = {a,b,c} 表示arr[a~b]中的任何一个值都能改成c 并且每一种操作,都可以执行任意次,其中 0 <= a <= b < n 那么经过若干次的魔法操作,你当然可能得到arr的更大的累加和 返回arr尽可能大的累加和 n <= 10^7 m <= 10^6 arr中的值和c的范围 <= 10^12 已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先 Leetcode链接 : https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-iv/ 给定一棵多叉树的头节点head 每个节点的颜色只会是0、1、2、3中的一种 任何两个节点之间的都有路径 如果节点a和节点b的路径上,包含全部的颜色,这条路径算达标路径 (a -> ... -> b)和(b -> ... -> a)算两条路径 求多叉树上达标的路径一共有多少? 点的数量 <= 10^5 第004节 2021年12月第3周流行算法题目解析 来自TME2022校园招聘后台开发/运营开发/业务运维/应用开发笔试 给定一棵二叉树的头节点head,和一个正数k。从最底层开始,每一层右移k位,然后往上走过每一层,进行树的调整 返回调整之后树的头节点 具体详情请参加如下的测试页面 测试链接 : https://www.nowcoder.com/test/33701596/summary 本题目为该试卷第1题 来自TME2022校园招聘后台开发/运营开发/业务运维/应用开发笔试 给定一个只由'0'和'1'组成的字符串,代表一个无符号整数 你只能在连续的一个子串上,翻转子串,也就是子串上,0变1,1变0。返回最大的结果 具体详情请参加如下的测试页面 测试链接 : https://www.nowcoder.com/test/33701596/summary 本题目为该试卷第2题 来自TME2022校园招聘后台开发/运营开发/业务运维/应用开发笔试 给定两个参数n和k,返回m 含义:k进制的情况下,把1~m每一位的状态列出来,其中1状态出现的数量要>=n 返回最小的、能做到这一点的m值 具体详情请参加如下的测试页面 测试链接 : https://www.nowcoder.com/test/33701596/summary 本题目为该试卷第3题 你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比1大的数 表示有树的单元格,也可以行走,数值表示树的高度 每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。 你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。 你将从 (0, 0) 点开始工作,返回你砍完所有树需要走的最小步数。 如果你无法砍完所有的树,返回 -1 。 可以保证的是,没有两棵树的高度是相同的,并且你至少需要砍倒一棵树 Leetcode链接 : https://leetcode.com/problems/cut-off-trees-for-golf-event/ 来自CMU入学申请考试 给定一个长度为 N 的字符串 S,由字符'a'和'b'组成,空隙由 '?' 表示 你的任务是用a字符或b字符替换每个间隙, 替换完成后想让连续出现同一种字符的最长子串尽可能短 例如,S = "aa??bbb", 如果将"??"替换为"aa" ,即"aaaabbb",则由相等字符组成的最长子串长度为4 如果将"??"替换为"ba" ,即"aababbb",则由相等字符组成的最长子串长度为3 那么方案二是更好的结果,返回3 S的长度 <= 10^6 第005节 2021年12月第4周流行算法题目解析 来自美团 给定一个无向图 从任何一个点x出发,比如有一条路径: x -> a -> b -> c -> y 这条路径上有5个点并且5个点都不一样的话,我们说(x,a,b,c,y)是一条合法路径 这条合法路径的代表,就是x,a,b,c,y所组成的集合,我们叫做代表集合 如果从b到y,还有一条路径叫(b,a,c,x,y),那么(x,a,b,c,y)和(b,a,c,x,y)是同一个代表集合 返回这个无向图中所有合法路径的代表集合数量 题目给定点的数量n <= 15,边的数量m <= 60 所有的点编号都是从0~n-1的 来自北京北明数科信息技术有限公司 class AreaResource { String area; // area表示的是地区全路径,最多可能有6级,比如: 中国,四川,成都  或者  中国,浙江,杭州 String spliter; // 比如:逗号 -> , long count; // 表示地区的门店数量 } 现在需要把  List 进行转换,需要做到同级的地域能合并 比如:area为中国,四川,成都 ,有10个门店;area为中国,浙江,杭州,有25个门店;area为中国,浙江,义乌,有22个门店 最终生成的JSON字符串为: {"中国":{"四川":{"成都":10]},"浙江":{"义乌":22,"杭州":25}}} 请实现下面的方法 public String mergeCount(List areas)  来自hulu 有一个以原点为圆心,半径为1的圆 在这个圆的圆周上,有一些点 因为所有的点都在圆周上,所以每个点可以有很简练的表达 比如:用0来表示一个圆周上的点,这个点就在(1,0)位置 比如:用6000来表示一个点,这个点是(1,0)点沿着圆周逆时针转60.00度之后所在的位置 比如:用18034来表示一个点,这个点是(1,0)点沿着圆周逆时针转180.34度之后所在的位置 这样一来,所有的点都可以用[0, 36000)范围上的数字来表示 那么任意三个点都可以组成一个三角形,返回能组成钝角三角形的数量 整个二维平面算是一张地图,给定[x,y],表示你站在x行y列 你可以选择面朝的任何方向 给定一个正数值angle,表示你视野的角度为 这个角度内你可以看无穷远,这个角度外你看不到任何东西 给定一批点的二维坐标, 返回你在朝向最好的情况下,最多能看到几个点 有m个同样的苹果,认为苹果之间无差别 有n个同样的盘子,认为盘子之间也无差别 还有,比如5个苹果如果放进3个盘子, 那么1、3、1和1、1、3和3、1、1的放置方法,也认为是一种方法 如上的设定下,返回有多少种放置方法 第006节 2021年12月第5周流行算法题目解析 有一组 n 个人作为实验对象,从 0 到 n - 1 编号,其中每个人都有不同数目的钱, 以及不同程度的安静值(quietness) 为了方便起见,我们将编号为 x 的人简称为 "person x "。 给你一个数组 richer ,其中 richer[i] = [ai, bi] 表示 person ai 比 person bi 更有钱 另给你一个整数数组 quiet ,其中 quiet[i] 是 person i 的安静值 richer 中所给出的数据 逻辑自洽 也就是说,在 person x 比 person y 更有钱的同时,不会出现 person y 比 person x 更有钱的情况 现在,返回一个整数数组 answer 作为答案,其中 answer[x] = y 的前提是: 在所有拥有的钱肯定不少于 person x 的人中,person y 是最安静的人(也就是安静值 quiet[y] 最小的人)。 leetcode链接 : https://leetcode.com/problems/loud-and-rich/ 来自hulu 有n个人,m个任务,任务之间有依赖记录在int[][] depends里 比如: depends[i] = [a, b],表示a任务依赖b任务的完成 其中 0 <= a < m,0 <= b < m 1个人1天可以完成1个任务,每个人都会选当前能做任务里,标号最小的任务 一个任务所依赖的任务都完成了,该任务才能开始做 返回n个人做完m个任务,需要几天 来自hulu 你只有1*1、1*2、1*3、1*4,四种规格的砖块 你想铺满n行m列的区域,规则如下: 1)不管那种规格的砖,都只能横着摆 比如1*3这种规格的砖,3长度是水平方向,1长度是竖直方向 2)会有很多方法铺满整个区域,整块区域哪怕有一点点不一样,就算不同的方法 3)区域内部(不算区域整体的4条边界),不能有任何砖块的边界线(从上一直贯穿到下) 返回符合三条规则下,铺满n行m列的区域,有多少种不同的摆放方法 第007节 2022年1月第1周流行算法题目解析 来自阿里 给定一个只由'a'和'b'组成的字符串str, str中"ab"和"ba"子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的顺序,最后让str消除到尽可能的短 返回尽可能的短的剩余字符串 在一张 无向 图上,节点编号0~N-1。老鼠开始在1节点,猫在2节点,0号节点是洞,老鼠想进洞 老鼠第先出发,猫后出发,轮流行动。 在每个玩家的行动中,他们 必须 沿着图中与所在当前位置连通的一条边移动 此外猫无法移动到洞中(节点 0)。 然后,游戏在出现以下三种情形之一时结束: 如果猫和老鼠出现在同一个节点,猫获胜。 如果老鼠到达洞中,老鼠获胜。 如果某一位置重复出现(即,玩家的位置和移动顺序都与上一次行动相同),游戏平局。 给你一张图 graph ,并假设两位玩家都都以最佳状态参与游戏,返回谁获胜 leetcode链接 : https://leetcode.com/problems/cat-and-mouse/ 给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m , 数组下标 从 1 开始 计数。 初始时,你的分数为 0 。 你需要执行恰好 m 步操作。在第 i 步操作(从 1 开始 计数)中,需要: 选择数组 nums 开头处或者末尾处 的整数 x 。 你获得 multipliers[i] * x 分,并累加到你的分数中。 将 x 从数组 nums 中移除。 在执行 m 步操作后,返回 最大 分数。 leetcode链接 : https://leetcode.com/problems/maximum-score-from-performing-multiplication-operations/ 来自学员问题 给定一个二维数组,其中全是非负数 每一步都可以往上、下、左、右四个方向运动 返回从左下角走到右下角的最短距离 第008节 2022年1月第2周流行算法题目解析 给定一个非常大的List list 每一个字符串类似 : "hello,world,have,hello,world" 这一个字符串中,有2个hello,2个world,1个have 请设计一种多线程处理方案,统计list中每一个字符串,切分出来的单词数量,并且汇总 最终返回一个HashMap表示每个字符串在list中一共出现几次 多线程设计 + 算法 本题没有代码实现,会在课上讲述思路 给定一个正数数组arr,其中每个值代表砖块长度 所有砖块等高等宽,只有长度有区别 每一层可以用1块或者2块砖来摆 要求每一层的长度一样 要求必须使用所有的砖块 请问最多摆几层 来自兴业数金 给定一个字符串形式的数,比如"3421"或者"-8731" 如果这个数不在-32768~32767范围上,那么返回"NODATA" 如果这个数在-32768~32767范围上,那么这个数就没有超过16个二进制位所能表达的范围 返回这个数的2进制形式的字符串和16进制形式的字符串,用逗号分割 给你一个下标从 0 开始包含 n 个正整数的数组 arr ,和一个正整数 k 。 如果对于每个满足 k <= i <= n-1 的下标 i ,都有 arr[i-k] <= arr[i] ,那么我们称 arr 是 K 递增 的。 比方说,arr = [4, 1, 5, 2, 6, 2] 对于 k = 2 是 K 递增的,因为: arr[0] <= arr[2] (4 <= 5) arr[1] <= arr[3] (1 <= 2) arr[2] <= arr[4] (5 <= 6) arr[3] <= arr[5] (2 <= 2) 但是,相同的数组 arr 对于 k = 1 不是 K 递增的(因为 arr[0] > arr[1]), 对于 k = 3 也不是 K 递增的(因为 arr[0] > arr[3] )。 每一次 操作 中,你可以选择一个下标 i 并将 arr[i] 改成任意 正整数。 请你返回对于给定的 k ,使数组变成 K 递增的 最少操作次数 。 leetcode链接 : https://leetcode.com/problems/minimum-operations-to-make-the-array-k-increasing/ 来自美团 小美有一个长度为n的数组, 为了使得这个数组的和尽量大,她向会魔法的小团进行求助 小团可以选择数组中至多两个不相交的子数组, 并将区间里的数全都变为原来的10倍 小团想知道他的魔法最多可以帮助小美将数组的和变大到多少? 给定一个非负数组arr,学生依次坐在0~N-1位置,每个值表示学生的安静值 如果在i位置安置插班生,那么i位置的安静值变成0,同时任何同学都会被影响到而减少安静值 同学安静值减少的量: N - 这个同学到插班生的距离 但是减到0以下的话,当做0处理 返回一个和arr等长的ans数组,ans[i]表示如果把插班生安排在i位置,所有学生的安静值的和 比如 : arr = {3,4,2,1,5},应该返回{4,3,2,3,4} 比如 : arr = {10,1,10,10,10},应该返回{24,27,20,20,22} arr长度 <= 10^5 arr中值 <= 2 * 10^5 注意:本题在直播课上讲错了,已经发了重新录制的视频,请一定要看更正后的视频 第009节 2022年1月第3周流行算法题目解析 A*算法 过程和Dijskra高度相处 有到终点的预估函数 只要预估值<=客观上最优距离,就是对的 预估函数是一种吸引力: 1)合适的吸引力可以提升算法的速度 2)吸引力“过强”会出现错误 在一个10^6 * 10^6的网格中, source = [sx, sy]是出发位置,target = [tx, ty]是目标位置 数组blocked是封锁的方格列表,被禁止的方格数量不超过200 blocked[i] = [xi, yi] 表示(xi, yi)的方格是禁止通行的 每次移动都可以走上、下、左、右四个方向 但是来到的位置不能在封锁列表blocked上 同时不允许走出网格 如果从source能到达target返回 true。否则返回false。 来自字节跳动 给定一个数组arr,其中的值有可能正、负、0 给定一个正数k 返回累加和>=k的所有子数组中,最短的子数组长度 第010节 2022年1月第4周流行算法题目解析 things是一个N*3的二维数组,商品有N件,商品编号从1~N 比如things[3] = [300, 2, 6] 代表第3号商品:价格300,重要度2,它是6号商品的附属商品 再比如things[6] = [500, 3, 0] 代表第6号商品:价格500,重要度3,它不是任何附属,它是主商品 每件商品的收益是价格*重要度,花费就是价格 如果一个商品是附属品,那么只有它附属的主商品购买了,它才能被购买 任何一个附属商品,只会有1个主商品 任何一个主商品的附属商品数量,不会超过2件 主商品和附属商品的层级最多有2层 给定二维数组things、钱数money,返回整体花费不超过money的情况下,最大的收益总和 来自美团 小团去参加军训,军训快要结束了,长官想要把大家一排n个人分成m组,然后让每组分别去参加阅兵仪式 只能选择相邻的人一组,不能随意改变队伍中人的位置 阅兵仪式上会进行打分,其中有一个奇怪的扣分点是每组的最大差值,即每组最大值减去最小值 长官想要让这分成的m组总扣分量最小,即这m组分别的极差之和最小 长官正在思索如何安排中,就让小团来帮帮他吧 给定一个包含 [0,n) 中不重复整数的黑名单 blacklist 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数 对它进行优化使其尽量少调用系统方法 Math.random() 1 <= n <= 1000000000 0 <= blacklist.length < min(100000, N) leetcode链接: https://leetcode.com/problems/random-pick-with-blacklist/ 来自米哈游 给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' 返回在甲板 board 上放置的 战舰 的数量 战舰只能水平或者垂直放置在 board 上。换句话说,战舰只能按 1 x k(1 行,k 列)或 k x 1(k 行,1 列)的形状建造 其中 k 可以是任意大小 两艘战舰之间至少有一个水平或垂直的空位分隔 (即没有相邻的战舰) leetcode链接: https://leetcode.com/problems/battleships-in-a-board 第011节 2022年2月第2周流行算法题目解析 给定一个长度为4的整数数组 cards 。你有 4 张卡片,每张卡片上都包含一个范围在 [1,9] 的数字 您应该使用运算符 ['+', '-', '*', '/'] 和括号 '(' 和 ')' 将这些卡片上的数字排列成数学表达式,以获得值24。 你须遵守以下规则: 除法运算符 '/' 表示实数除法,而不是整数除法。 例如, 4 /(1 - 2 / 3)= 4 /(1 / 3)= 12 。 每个运算都在两个数字之间。特别是,不能使用 “-” 作为一元运算符。 例如,如果 cards =[1,1,1,1] ,则表达式 “-1 -1 -1 -1” 是 不允许 的。 你不能把数字串在一起 例如,如果 cards =[1,2,1,2] ,则表达式 “12 + 12” 无效。 如果可以得到这样的表达式,其计算结果为 24 ,则返回 true ,否则返回 false 。 leetcode链接: https://leetcode.com/problems/24-game/ 设计位图 leetcode链接: https://leetcode-cn.com/problems/design-bitset/ 给定一个整数数组,返回所有数对之间的第 k 个最小距离 一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值 leetcode链接 : https://leetcode.com/problems/find-k-th-smallest-pair-distance/ 从点 (x, y) 可以转换到 (x, x+y)  或者 (x+y, y)。 给定一个起点 (sx, sy) 和一个终点 (tx, ty), 如果通过一系列的转换可以从起点到达终点, 则返回 True ,否则返回 False。 leetcode链接 : https://leetcode.com/problems/reaching-points/ Alice 有一个下标从 0 开始的数组 arr ,由 n 个正整数组成。 她会选择一个任意的 正整数 k 并按下述方式创建两个下标从 0 开始的新整数数组 lower 和 higher : 对每个满足 0 <= i < n 的下标 i ,lower[i] = arr[i] - k 对每个满足 0 <= i < n 的下标 i ,higher[i] = arr[i] + k 不幸地是,Alice 丢失了全部三个数组。但是,她记住了在数组 lower 和 higher 中出现的整数 但不知道每个整数属于哪个数组。请你帮助 Alice 还原原数组。 给你一个由 2n 个整数组成的整数数组 nums ,其中 恰好 n 个整数出现在 lower ,剩下的出现在 higher , 还原并返回 原数组 arr 。如果出现答案不唯一的情况,返回 任一 有效数组。 注意:生成的测试用例保证存在 至少一个 有效数组 arr 。 leetcode链接 : https://leetcode.com/problems/recover-the-original-array/ 第012节 2022年2月第3周流行算法题目解析 有 n 个城市通过一些航班连接。给你一个数组 flights , 其中 flights[i] = [fromi, toi, pricei] , 表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst, 你的任务是找到出一条最多经过 k 站中转的路线, 使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。 leetcode链接: https://leetcode.com/problems/cheapest-flights-within-k-stops/ 厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子 1)吃掉一个橘子。 2)如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 3)如果剩余橘子数 n 能被 3 整除,那么你可以吃掉 2*(n/3) 个橘子。 每天你只能从以上 3 种方案中选择一种方案。 请你返回吃掉所有 n 个橘子的最少天数。 leetcode链接: https://leetcode.com/problems/minimum-number-of-days-to-eat-n-oranges/ 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方 机器人可以接受下列三条指令之一: "G":直走 1 个单位 "L":左转 90 度 "R":右转 90 度 机器人按顺序执行指令 instructions,并一直重复它们。 只有在平面中存在环使得机器人永远无法离开时,返回 true 否则,返回 false。 leetcode链接 : https://leetcode.com/problems/robot-bounded-in-circle/ 来自微软 给定一个数组arr,一个正数num,一个正数k 可以把arr中的某些数字拿出来组成一组 要求该组中的最大值减去最小值<=num 且该组数字的个数一定要正好等于k 每个数字只能选择进某一组,不能进多个组 返回arr中最多有多少组 Alice 和 Bob 设计了一款新的石子游戏 现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值 给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。 Alice 和 Bob 轮流进行自己的回合,Alice 先手 每一回合,玩家需要从 stones 中移除任一石子 如果玩家移除石子后,导致 所有已移除石子 的价值 总和 可以被 3 整除,那么该玩家就 输掉游戏 。 如果不满足上一条,且移除后没有任何剩余的石子,那么 Bob 将会直接获胜(即便是在 Alice 的回合)。 假设两位玩家均采用 最佳 决策。如果 Alice 获胜,返回 true ;如果 Bob 获胜,返回 false 。 leetcode链接 : https://leetcode.com/problems/stone-game-ix/ 第013节 2022年2月第4周流行算法题目解析 来自微软 比如,str = "ayxbx" 有以下4种切法 : a | yxbx、ay | xbx、ayx | bx、ayxb | x 其中第1、3、4种切法符合:x和y的个数,至少在左右两块中的一块里有相同的数量 所以返回3 给定一个字符串str,长度为N 你有N-1种划分方法,把str切成左右两半,返回有几种切法满足: x和y的个数,至少在左右两块中的一块里有相同的数量 来自微软 给定一个正数num,要返回一个大于num的数, 并且每一位和相邻位的数字不能相等 返回达标的数字中,最小的那个 给你一个整数数组 arr 请你将该数组分隔为长度最多为 k 的一些(连续)子数组 分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。 返回将数组分隔变换后能够得到的元素最大和 注意: 原数组和分隔后的数组对应顺序应当一致, 也就是说,你只能选择分隔数组的位置而不能调整数组中的顺序。 leetcode链接 : https://leetcode.com/problems/partition-array-for-maximum-sum/ 来自学员贡献 返回一个数组中,所有降序三元组的数量 比如 : {5, 3, 4, 2, 1} 所有降序三元组为 :  {5, 3, 2}、{5, 3, 1}、{5, 4, 2}、{5, 4, 1}、{5, 2, 1}、{3, 2, 1}、{4, 2, 1} 所以返回数量7 给你一个下标从 0 开始的字符串数组 words 。每个字符串都只包含 小写英文字母  words 中任意一个子串中,每个字母都至多只出现一次。 如果通过以下操作之一,我们可以从 s1 的字母集合得到 s2 的字母集合,那么我们称这两个字符串为 关联的 : 往 s1 的字母集合中添加一个字母。从 s1 的字母集合中删去一个字母 将 s1 中的一个字母替换成另外任意一个字母(也可以替换为这个字母本身)。 数组 words 可以分为一个或者多个无交集的 组 。如果一个字符串与另一个字符串关联,那么它们应当属于同一个组 你需要确保分好组后,一个组内的任一字符串与其他组的字符串都不关联。可以证明在这个条件下,分组方案是唯一的 请你返回一个长度为 2 的数组 ans : ans[0] 是 words 分组后的 总组数 。 ans[1] 是字符串数目最多的组所包含的字符串数目。 leetcode链接 : https://leetcode.com/problems/groups-of-strings/ 第014节 2022年3月第1周流行算法题目解析 强连通分量的原理 1,理解什么是dfn序号 2,理解什么是low序号 3,理解算法流程中,节点的三种状态:未遍历、遍历了未结算、遍历了已结算 4,理解什么是scc序号 tarjan(cur)算法求强连通分量流程: 1,遍历到一个“未遍历”状态的节点cur 2,给cur节点dfn编号和low编号,初始时low(cur) = dfn(cur) 3,将cur标记为“遍历了未结算”状态,并放入栈中 4,对于cur的每个孩子q,做如下两步操作: 1)如果q未遍历,执行tarjen(u);否则,不执行tarjan(u) 2)步骤1)后,q就遍历过了,如果是“遍历未结算”,令low(cur) = min ( low(cur), low(q)); 如果是“已结算”,什么也不做 5,如果经历完步骤4,依然发现low(cur) = dfn(cur), 说明cur是一个强连通分量的头节点,分配给cur一个scc号, 并去结算cur及其cur之下的点(利用栈) 强连通分量代码解析 N个学校之间有单向的网络,每个学校得到一套软件后, 可以通过单向网络向周边的学校传输 问题1: 初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件 问题2: 至少需要添加几条传输线路(边),使任意向一个学校发放软件后, 经过若干次传送,网络内所有的学校最终都能得到软件 2 <= N <= 1000 A -> B,表示A认为B是红人 A -> B -> C,表示A认为B是红人,B认为C是红人, 规定“认为”关系有传递性,所以A也认为C是红人 给定一张有向图,方式是给定M个有序对(A, B) (A, B)表示A认为B是红人,该关系具有传递性 给定的有序对中可能包含(A, B)和(B, C),但不包含(A,C) 求被其他所有人认为是红人的总数 在一个地图上有若干个炸弹,每个炸弹会呈现十字型引爆 每个炸弹都有其当量值,这个值决定了这个炸弹的爆炸半径 如果一个炸弹被引爆时,有其它炸弹在其爆炸半径内, 那么其它炸弹也会爆炸 请问使地图上所有炸弹爆炸所需的最少人为引爆次数。 第015节 2022年3月第2周流行算法题目解析 来自字节飞书团队 在字节跳动,大家都使用飞书的日历功能进行会议室的预订,遇到会议高峰时期, 会议室就可能不够用,现在请你实现一个算法,判断预订会议时是否有空的会议室可用。 为简化问题,这里忽略会议室的大小,认为所有的会议室都是等价的, 只要空闲就可以容纳任意的会议,并且: 1. 所有的会议预订都是当日预订当日的时段 2. 会议时段是一个左闭右开的时间区间,精确到分钟 3. 每个会议室刚开始都是空闲状态,同一时间一个会议室只能进行一场会议 4. 会议一旦预订成功就会按时进行 比如上午11点到中午12点的会议即[660, 720) 给定一个会议室总数m 一个预定事件由[a,b,c]代表 : a代表预定动作的发生时间,早来早得; b代表会议的召开时间; c代表会议的结束时间 给定一个n*3的二维数组,即可表示所有预定事件 返回一个长度为n的boolean类型的数组,表示每一个预定时间是否成功 来自字节飞书团队 小歪每次会给你两个字符串: 笔记s1和关键词s2,请你写一个函数 判断s2的排列之一是否是s1的子串 如果是,返回true 否则,返回false 来自字节飞书团队 语法补全功能,比如"as soon as possible" 当我们识别到"as soon as"时, 基本即可判定用户需要键入"possible" 设计一个统计词频的模型,用于这个功能 类似(prefix, next word)这样的二元组 比如一个上面的句子"as soon as possible" 有产生如下的二元组(as, soon, 1)、(as soon, as, 1)、(as soon as, possible, 1) 意思是这一个句子产生了如下的统计: 当前缀为"as",接下来的单词是"soon",有了1个期望点 当前缀为"as soon",接下来的单词是"as",有了1个期望点 当前缀为"as soon as",接下来的单词是"possible",有了1个期望点 那么如果给你很多的句子,当然就可以产生很多的期望点,同一个前缀下,同一个next word的期望点可以累加 现在给你n个句子,让你来建立统计 然后给你m个句子,作为查询 最后给你k,表示每个句子作为前缀的情况下,词频排在前k名的联想 返回m个结果,每个结果最多k个单词 来自字节飞书团队 假设数组a和数组b为两组信号 1) length(b) <= length(a) 2) 对于任意0<=i 1 返回你最多能挑选几个数 来自美团 有一块10000 * 10000 * 10000的立方体豆腐 豆腐的前左下角放在(0,0,0)点,豆腐的后右上角放在(10000,10000,10000)点 下面给出切法的数据结构 [a,b] a = 1,表示x = b处,一把无穷大的刀平行于yz面贯穿豆腐切过去 a = 2,表示y = b处,一把无穷大的刀平行于xz面贯穿豆腐切过去 a = 3,表示z = b处,一把无穷大的刀平行于xy面贯穿豆腐切过去 a = 1 or 2 or 3,0<=b<=10000 给定一个n*2的二维数组,表示切了n刀 返回豆腐中最大的一块体积是多少 来自美团 最大子段和是 一个经典问题,即对于一个数组找出其和最大的子数组。 现在允许你在求解该问题之前翻转这个数組的连续一段 如翻转(1,2,3,4,5,6)的第三个到第五个元素組成的子数组得到的是(1,2,5,4,3,6), 则翻转后该数组的最大子段和最大能达到多少? 来自字节 和上一题一样的题,来自字节笔试第4题 给定两个数組values和numbers, values[i]表示i号宝石的单品价值 numbers[i]表示i号宝石的数量 i号宝石的总价值 = values[i] * numbers[i] 如果有一种魔法,可以翻转任何区间L...R的宝石,也就是改变L..R的宝石排列,变成逆序的 求在允许用一次魔法的情况下,任取一段连续区间,能达到的最大价值 这两个问法解法都几乎一样,区别无非是: 上一题美团的问题: 可进行一次翻转情况下,子数组最大累加和 这一题字节的问题: 可进行一次翻转情况下,子数组最大价值和 来自美团 void add(int L, int R, int C)代表在arr[L...R]上每个数加C int get(int L, int R)代表查询arr[L...R]上的累加和 假设你可以在所有操作开始之前,重新排列arr 请返回每一次get查询的结果都加在一起最大能是多少 输入参数: int[] arr : 原始数组 int[][] ops,二维数组每一行解释如下: [a,b,c],如果数组有3个数,表示调用add(a,b,c) [a,b],如果数组有2个数,表示调用get(a,b) a和b表示arr范围,范围假设从1开始,不从0开始 输出:假设你可以在开始时重新排列arr,返回所有get操作返回值累计和最大是多少? 来自bilibili 现在有N条鱼,每条鱼的体积为Ai,从左到右排列,数组arr给出 每一轮,左边的大鱼一定会吃掉右边比自己小的第一条鱼, 并且每条鱼吃比自己小的鱼的事件是同时发生的。 返回多少轮之后,鱼的数量会稳定 注意:6 6 3 3 第一轮过后 : 对于两个6来说,右边比自己小的第一条鱼都是第1个3,所以只有这个3被吃掉, 数组变成 : 6 6 3(第2个3) 第二轮过后 : 6 6 返回2 来自银联编程比赛 某公司计划推出一批投资项目。 product[i] = price 表示第 i 个理财项目的投资金额 price 。 客户在按需投资时,需要遵循以下规则: 客户在首次对项目 product[i] 投资时,需要投入金额 price 对已完成首次投资的项目 product[i] 可继续追加投入, 但追加投入的金额需小于上一次对该项目的投入(追加投入为大于 0 的整数) 为控制市场稳定,每人交易次数不得大于 limit。(首次投资和追加投入均记作 1 次交易) 若对所有理财项目中最多进行 limit 次交易,使得投入金额总和最大,请返回这个最大值的总和。 测试链接 : https://leetcode-cn.com/contest/cnunionpay-2022spring/problems/I4mOGz/ 来自银联编程比赛 为了不断提高用户使用的体验,开发团队正在对产品进行全方位的开发和优化。 已知开发团队共有若干名成员,skills[i] 表示第 i 名开发人员掌握技能列表。 如果两名成员各自拥有至少一门对方未拥有的技能,则这两名成员可以「合作开发」。 请返回当前有多少对开发成员满足「合作开发」的条件。 由于答案可能很大,请你返回答案对 10^9 + 7 取余的结果。 测试链接 : https://leetcode-cn.com/contest/cnunionpay-2022spring/problems/lCh58I/ 第017节 2022年3月第4周流行算法题目解析 来自学员的考试 来自华为 给定一个n*2的二维数组,表示有n个任务 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数 你作为单线程的人,不能并行处理任务,但是每个任务都只需要一个单位时间完成 你需要将所有任务的执行时间,位于开始做的时间和最后期限之间 返回你能否做到这一点 来自字节内部训练营 某公司游戏平台的夏季特惠开始了,你决定入手一些游戏。现在你一共有X元的预算。 该平台上所有的 n 个游戏均有折扣,标号为 i 的游戏的原价a_i元,现价只要b_i元 也就是说该游戏可以优惠 a_i - b_i,并且你购买该游戏能获得快乐值为 w_i 由于优惠的存在,你可能做出一些冲动消费导致最终买游戏的总费用超过预算, 只要满足 : 获得的总优惠金额不低于超过预算的总金额 那在心理上就不会觉得吃亏。 现在你希望在心理上不觉得吃亏的前提下,获得尽可能多的快乐值。 测试链接 : https://leetcode-cn.com/problems/tJau2o/ 来自学员问题 给定一个数组arr,可能有正、有负、有0,无序 只能挑选两个数字,想尽量让两个数字加起来的绝对值尽量小 返回可能的最小的值 来自字节 一开始在0位置,每一次都可以向左或者向右跳 第i次能向左或者向右跳严格的i步 请问从0到x位置,至少跳几次可以到达 字节考的问题其实就是这个问题 leetcode测试链接 : https://leetcode.com/problems/reach-a-number/ 来自理想汽车 a -> b,代表a在食物链中被b捕食 给定一个有向无环图,返回 这个图中从最初级动物到最顶级捕食者的食物链有几条 线上测试链接 : https://www.luogu.com.cn/problem/P4017 来自学员问题 给定一个数字n,表示一开始有编号1~n的树木,列成一条直线 给定一个有序数组arr,表示现在哪些树已经没了,arr[i]一定在[1,n]范围 给定一个数字m,表示你可以补种多少棵树 返回补种之后,最长的连续树木,有多少棵 来自网易 不规则数独问题 3*3填数独 每一行要填1~3 每一列要填1~3 3*3的区域会拆分成不规则的三个集团区域 每个集团区域3个格子 每个集团的区域都一定是一个连在一起的整体,可能不规则 每个集团内要填1~3 如果只有一个解返回"Unique",如果有多个解返回"Multiple",如果没有解返回"No" 解析请看,大厂刷题班,28节,leetcode原题,数独那两个题 本题就是改变一下桶的归属而已 来自学员问题 大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个 操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之二的鸡蛋放回仓库,手里留下三分之一 返回从x到y的最小操作次数 1 <= x,y <= 10^18 练一下,用平凡解做限制 第018节 2022年3月第5周流行算法题目解析 km算法流程详解、代码实现 来自微软 在N*N的正方形棋盘中,有N*N个棋子,那么每个格子正好可以拥有一个棋子 但是现在有些棋子聚集到一个格子上了,比如: 2 0 3 0 1 0 3 0 0 如上的二维数组代表,一共3*3个格子 但是有些格子有2个棋子、有些有3个、有些有1个、有些没有 请你用棋子移动的方式,让每个格子都有一个棋子 每个棋子可以上、下、左、右移动,每移动一步算1的代价 返回最小的代价 给你一个长度为 n 的整数数组 nums 和一个整数 numSlots ,满足2 * numSlots >= n 总共有 numSlots 个篮子,编号为 1 到 numSlots 你需要把所有 n 个整数分到这些篮子中,且每个篮子 至多 有 2 个整数 一种分配方案的 与和 定义为每个数与它所在篮子编号的 按位与运算 结果之和。 比方说,将数字 [1, 3] 放入篮子 1 中,[4, 6] 放入篮子 2 中, 这个方案的与和为 (1 AND 1) + (3 AND 1) + (4 AND 2) + (6 AND 2) = 1 + 1 + 0 + 2 = 4 。 请你返回将 nums 中所有数放入 numSlots 个篮子中的最大与和。 Leetcode链接:https://leetcode.com/problems/maximum-and-sum-of-array 来自网易 我军一起干掉敌人的最少移动数 km算法的又一个题 给定一个矩阵int[][] matrix matrix[i][j] == -2,代表此处(i,j)有山脉,无法通行 matrix[i][j] == -1,代表此处(i,j)是一个敌军 matrix[i][j] == 0,代表此处(i,j)是空地,可以自由行动 matrix[i][j] > 0,代表此处(i,j)是一个我军,行动能力就是matrix[i][j] 我军只能上、下、左、右移动,只可以穿过同样是我军的地点和空地的地点,但是最多移动matrix[i][j]步 任何一个我军都不能穿过山脉,任何一个我军可以来到敌军的位置,表示消灭了敌军,但是如果这么做了,这个我军就不能再移动了 你可以任意决定所有我军的行动策略,每一步你都可以随意选择一个友军移动随意方向的,但是必须合法。 如果你可以让所有我军在消耗完自身的行动能力之前,消灭所有的敌军,请返回总距离的最小值 如果你就是无法消灭所有敌军,返回-1 第019节 2022年4月第1周流行算法题目解析 来自阿里笔试 牛牛今年上幼儿园了,老师叫他学习减法 老师给了他5个数字,他每次操作可以选择其中的4个数字减1 减一之后的数字不能小于0,因为幼儿园的牛牛还没有接触过负数 现在牛牛想知道,自己最多可以进行多少次这样的操作 扩展问题来自leetcode 2141,掌握了这个题原始问题就非常简单了 leetcode测试链接 : https://leetcode.com/problems/maximum-running-time-of-n-computers/ 来自学员问题 找到非负数组中拥有"最大或的结果"的最短子数组 来自通维数码 每个会议给定开始和结束时间 后面的会议如果跟前面的会议有任何冲突,完全取消冲突的、之前的会议,安排当前的 给定一个会议数组,返回安排的会议列表 来自小红书 小红书第一题: 薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的三个格子之一, 而且不能跨出红薯地,他可以获得经过的格子上的所有红薯,请问他可以获得最多的红薯个数。 来自小红书 小红书第二题: 薯队长最近在参加了一个活动,主办方提供了N个礼物以供挑选, 每个礼物有一个价值,范围在0 ~ 10^9之间, 薯队长可以从中挑选k个礼物 返回:其中价值最接近的两件礼物之间相差值尽可能大的结果 来自小红书 小红书第三题: 薯队长最近在玩一个游戏,这个游戏桌上会有一排不同颜色的方块, 每次薯队长可以选择一个方块,便可以消除这个方块以及和他左右相临的 若干的颜色相同的方块,而每次消除的方块越多,得分越高。 具体来说,桌上有以个方块排成一排 (1 <= N <= 200), 每个方块有一个颜色,用1~N之间的一个整数表示,相同的数宇代表相同的颜色, 每次消除的时候,会把连续的K个相同颜色的方块消除,并得到K*K的分数, 直到所有方块都消除。显然,不同的消除顺序得分不同,薯队长希望您能告诉他,这个游戏最多能得到多少分 体系学习班,代码46节,视频在47节,消箱子原题,RemoveBoxes 给定一个数组arr,含有n个数字,都是非负数 给定一个正数k 返回所有子序列中,累加和最小的前k个子序列累加和 假设K不大,怎么算最快? 来自Amazon 给定一个数组arr,含有n个数字,可能有正、有负、有0 给定一个正数k 返回所有子序列中,累加和最大的前k个子序列累加和 假设K不大,怎么算最快? 第020节 2022年4月第2周流行算法题目解析 来自携程 给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x x的价值是x的不同质因子的数量 返回所有选择数字的方案中,得到的x的价值之和 来自网易 3.27笔试 一个二维矩阵,上面只有 0 和 1,只能上下左右移动 如果移动前后的元素值相同,则耗费 1 ,否则耗费 2。 问从左上到右下的最小耗费 来自美团 3.26笔试 给定一个非负数组,任意选择数字,使累加和最大且为7的倍数,返回最大累加和 n比较大,10的5次方 来自美团 3.26笔试 给定一个正数n, 表示有0~n-1号任务 给定一个长度为n的数组time,time[i]表示i号任务做完的时间 给定一个二维数组matrix matrix[j] = {a, b} 代表:a任务想要开始,依赖b任务的完成 只要能并行的任务都可以并行,但是任何任务只有依赖的任务完成,才能开始 返回一个长度为n的数组ans,表示每个任务完成的时间 输入可以保证没有循环依赖 来自百度 给出一个长度为n的01串,现在请你找到两个区间, 使得这两个区间中,1的个数相等,0的个数也相等 这两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全一样 现在请你找到两个最长的区间,满足以上要求。 来自阿里 x = { a, b, c, d } y = { e, f, g, h } x、y两个小数组长度都是4 如果有: a + e = b + f = c + g = d + h 那么说x和y是一个完美对 题目给定N个小数组,每个小数组长度都是K 返回这N个小数组中,有多少完美对 来自快手 某公司年会上,大家要玩一食发奖金游戏,一共有n个员工, 每个员工都有建设积分和捣乱积分 他们需要排成一队,在队伍最前面的一定是老板,老板也有建设积分和捣乱积分 排好队后,所有员工都会获得各自的奖金, 该员工奖金 = 排在他前面所有人的建设积分乘积 / 该员工自己的捣乱积分,向下取整 为了公平(放屁),老板希望 : 让获得奖金最高的员工,所获得的奖金尽可能少 所以想请你帮他重新排一下队伍,返回奖金最高的员工获得的、尽可能少的奖金数额 1 <= n <= 1000, 1<= 积分 <= 10000; 第021节 2022年4月第3周流行算法题目解析 来自小红书 3.13 笔试 数组里有0和1,一定要翻转一个区间,翻转:0变1,1变0 请问翻转后可以使得1的个数最多是多少? 来自小红书 3.13 笔试 给定一个数组,想随时查询任何范围上的最大值 如果只是根据初始数组建立、并且以后没有修改, 那么RMQ方法比线段树方法好实现,时间复杂度O(N*logN),额外空间复杂度O(N*logN) 来自腾讯音乐 原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组 其中可能有相等的数字,总体趋势是递增的 但是其中有些位置的数被替换成了0,我们需要求出所有的把0替换的方案数量: 1) 填充的每一个数可以大于等于前一个数,小于等于后一个数 2) 填充的每一个数不能大于k 来自学员问题 总长度为n的数组中,所有长度为k的子序列里,有多少子序列的和为偶数 来自微众 4.11笔试 给定n位长的数字字符串和正数k,求该子符串能被k整除的子串个数 (n<=1000,k<=100) 第022节 2022年5月第1周流行算法题目解析 来自蔚来汽车 给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。 每一步,你可以从下标 i 跳到下标 i + 1 、i - 1 或者 j : i + 1 需满足:i + 1 < arr.length i - 1 需满足:i - 1 >= 0 j 需满足:arr[i] == arr[j] 且 i != j 请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。 注意:任何时候你都不能跳到数组外面。 leetcode测试链接 : https://leetcode-cn.com/problems/jump-game-iv/ 来自微众 人工智能岗 一开始有21个球,甲和乙轮流拿球,甲先、乙后 每个人在自己的回合,一定要拿不超过3个球,不能不拿 最终谁的总球数为偶数,谁赢 请问谁有必胜策略 来自学员问题,真实大厂面试题 1、2、3...n-1、n、n、n+1、n+2... 在这个序列中,只有一个数字有重复(n) 这个序列是无序的,找到重复数字n 这个序列是有序的,找到重复数字n 来自学员问题,蓝桥杯练习题 f(i) : i的所有因子,每个因子都平方之后,累加起来 比如f(10) = 1平方 + 2平方 + 5平方 + 10平方 = 1 + 4 + 25 + 100 = 130 给定一个数n,求f(1) + f(2) + .. + f(n) n <= 10的9次方 来自optiver 给定一个字符串str,和一个正数k 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合 返回有几个回文子串 第023节 2022年5月第2周流行算法题目解析 来自字节 5.6笔试 给定N件物品,每个物品有重量(w[i])、有价值(v[i]) 只能最多选两件商品,重量不超过bag,返回价值最大能是多少? N <= 10^5, w[i] <= 10^5, v[i] <= 10^5, bag <= 10^5 本题的关键点:什么数据范围都很大,唯独只需要最多选两件商品,这个可以利用一下 来自网易 小红拿到了一个长度为N的数组arr,她准备只进行一次修改 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同) 并使得所有数之和为X的倍数 小红想知道,一共有多少种不同的修改方案 1 <= N, X <= 10^5, 1 <= arr[i], P <= 10^9 来自字节 一共有n个人,从左到右排列,依次编号0~n-1 h[i]是第i个人的身高 v[i]是第i个人的分数 要求从左到右选出一个子序列,在这个子序列中的人,从左到右身高是不下降的 返回所有符合要求的子序列中,分数最大累加和是多大 n <= 10的5次方, 1 <= h[i] <= 10的9次方, 1 <= v[i] <= 10的9次方 来自网易 给出一个有n个点,m条有向边的图 你可以施展魔法,把有向边,变成无向边 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法的情况下,1到n的最短路,如果不能到达,输出-1。 n为点数, 每条边用(a,b,v)表示,含义是a到b的这条边,权值为v 点的数量 <= 10^5,边的数量 <= 2 * 10^5,1 <= 边的权值 <= 10^6 来自网易 小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色 每次小红可能选择同一个小方块重复染色 每次染色以后,你需要帮小红回答出当前的白色连通块数 如果两个小方块共用同一个面,且颜色相同,则它们是连通的 给定n、m、h,表示大立方体的长、宽、高 给定k次操作,每一次操作用(a, b, c)表示在大立方体的该位置进行染色 返回长度为k的数组,表示每一次操作后,白色方块的连通块数 n * m * h <= 10 ^ 5,k <= 10 ^ 5 第024节 2022年5月第3周流行算法题目解析 来自字节 输入: 去重数组arr,里面的数只包含0~9 limit,一个数字 返回: 要求比limit小的情况下,能够用arr拼出来的最大数字 来自京东 4.2笔试 给定一个数组arr,长度为N,arr中所有的值都在1~K范围上 你可以删除数字,目的是让arr的最长递增子序列长度小于K 返回至少删除几个数字能达到目的 N <= 10^4,K <= 10^2 来自学员问题 给定一个数组arr,表示从早到晚,依次会出现的导弹的高度 大炮打导弹的时候,如果一旦大炮定了某个高度去打,那么这个大炮每次打的高度都必须下降一点 1) 如果只有一个大炮,返回最多能拦截多少导弹 2) 如果所有的导弹都必须拦截,返回最少的大炮数量 来自学员问题 为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机 游戏机由 N 个特殊弹簧排成一排,编号为 0 到 N-1 初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹簧处 通过按动弹簧,可以选择把小球向右弹射 jump[i] 的距离,或者向左弹射到任意左侧弹簧的位置 也就是说,在编号为 i 弹簧处按动弹簧, 小球可以弹向 0 到 i-1 中任意弹簧或者 i+jump[i] 的弹簧(若 i+jump[i]>=N ,则表示小球弹出了机器) 小球位于编号 0 处的弹簧时不能再向左弹。 为了获得奖励,你需要将小球弹出机器。 请求出最少需要按动多少次弹簧,可以将小球从编号 0 弹簧弹出整个机器,即向右越过编号 N-1 的弹簧。 测试链接 : https://leetcode-cn.com/problems/zui-xiao-tiao-yue-ci-shu/ 第025节 2022年5月第4周流行算法题目解析 每一个方案都有两个值(a,b),a为娱乐值,b为进攻值 给定很多的方案数组,给定娱乐值总目标(int),给定进攻值总目标(int) 要求选一些方案,这些方案的总娱乐值>=娱乐值总目标,总进攻值>=进攻值总目标 返回至少需要选几个方案 给定绳子总长度为M,每一个长度的绳子对应一个价格,比如(6, 10)表示剪成长度为6的绳子,对应价格10 可以重复切出某个长度的绳子,返回总长度为M的情况下,能得到的最大价值 每一个序列都是[a,b]的形式,a < b 序列连接的方式为,前一个序列的b,要等于后一个序列的a 比如 : [3, 7]、[7, 13]、[13, 26]这三个序列就可以依次连接 给定若干个序列,求最大连接的数量 给定区间的范围[xi,yi],xi<=yi,且都是正整数 找出一个坐标集合set,set中有若干个数字 set要和每个给定的区间,有交集 求set的最少需要几个数 比如给定区间 : [5, 8] [1, 7] [2, 4] [1, 9] set最小可以是: {2, 6}或者{2, 5}或者{4, 5} 来自字节 5.6笔试 给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度 n <= 10^6 来自京东 4.2笔试 给定一个长度为3N的数组,其中最多含有0、1、2三种值 你可以把任何一个连续区间上的数组,全变成0、1、2中的一种 目的是让0、1、2三种数字的个数都是N 返回最小的变化次数 第026节 2022年6月第1周流行算法题目解析 最好打开链接看图 用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角, 可以将球导向左侧或者右侧。 将球导向右侧的挡板跨过左上角和右下角,在网格中用 1 表示。 将球导向左侧的挡板跨过右上角和左下角,在网格中用 -1 表示。 在箱子每一列的顶端各放一颗球。每颗球都可能卡在箱子里或从底部掉出来。 如果球恰好卡在两块挡板之间的 "V" 形图案,或者被一块挡导向到箱子的任意一侧边上,就会卡住。 返回一个大小为 n 的数组 answer , 其中 answer[i] 是球放在顶部的第 i 列后从底部掉出来的那一列对应的下标, 如果球卡在盒子里,则返回 -1 本题测试链接 : https://leetcode.com/problems/where-will-the-ball-fall/ 把字符串 s 看作 "abcdefghijklmnopqrstuvwxyz" 的无限环绕字符串, 所以 s 看起来是这样的: ...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd.... 现在给定另一个字符串 p 。返回 s 中 不同 的 p 的 非空子串 的数量 测试链接 : https://leetcode.com/problems/unique-substrings-in-wraparound-string/ 给你一个字符串化学式 formula ,返回 每种原子的数量 。 原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。 如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。 例如,"H2O" 和 "H2O2" 是可行的,但 "H1O2" 这个表达是不可行的。 两个化学式连在一起可以构成新的化学式。 例如 "H2O2He3Mg4" 也是化学式。 由括号括起的化学式并佐以数字(可选择性添加)也是化学式。 例如 "(H2O2)" 和 "(H2O2)3" 是化学式。 返回所有原子的数量,格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 1), 然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。 示例 1: 输入:formula = "H2O" 输出:"H2O" 解释:原子的数量是 {'H': 2, 'O': 1}。 示例 2: 输入:formula = "Mg(OH)2" 输出:"H2MgO2" 解释:原子的数量是 {'H': 2, 'Mg': 1, 'O': 2}。 示例 3: 输入:formula = "K4(ON(SO3)2)2" 输出:"K4N2O14S4" 解释:原子的数量是 {'K': 4, 'N': 2, 'O': 14, 'S': 4}。 测试链接 : https://leetcode.com/problems/number-of-atoms/ 字符串的 波动 定义为子字符串中出现次数 最多 的字符次数与出现次数 最少 的字符次数之差。 给你一个字符串 s ,它只包含小写英文字母。请你返回 s 里所有 子字符串的 最大波动 值。 子字符串 是一个字符串的一段连续字符序列。 注意:必须同时有,最多字符和最少字符的字符串才是有效的 测试链接 : https://leetcode.cn/problems/substring-with-largest-variance/ 第027节 2022年6月第2周流行算法题目解析 n块石头放置在二维平面中的一些整数坐标点上 每个坐标点上最多只能有一块石头 如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。 给你一个长度为 n 的数组 stones , 其中 stones[i] = [xi, yi] 表示第 i 块石头的位置, 返回 可以移除的石子 的最大数量。 测试链接 : https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/ 作为国王的统治者,你有一支巫师军队听你指挥。 给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表示第 i 位巫师的力量值。 对于连续的一组巫师(也就是这些巫师的力量值是 strength 的 子数组), 总力量 定义为以下两个值的 乘积 : 巫师中 最弱 的能力值 * 组中所有巫师的个人力量值 之和 。 请你返回 所有 巫师组的 总 力量之和。由于答案可能很大,请将答案对 109 + 7 取余 后返回。 子数组 是一个数组里 非空 连续子序列。 测试链接 : https://leetcode.cn/problems/sum-of-total-strength-of-wizards/ 给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。 例如,序列 [4,6,16] 的最大公约数是 2 。 数组的一个 子序列 本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。 例如,[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一个子序列。 计算并返回 nums 的所有 非空 子序列中 不同 最大公约数的 数目 。 测试链接 : https://leetcode.com/problems/number-of-different-subsequences-gcds/ 给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。  示例 1: 输入: n = 5 输出: 2 解释: 5 = 2 + 3,共有两组连续整数([5],[2,3])求和后为 5。 示例 2: 输入: n = 9 输出: 3 解释: 9 = 4 + 5 = 2 + 3 + 4 示例 3: 输入: n = 15 输出: 4 解释: 15 = 8 + 7 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5 测试链接 : https://leetcode.com/problems/consecutive-numbers-sum/ 第028节 2022年6月第3周流行算法题目解析 arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成多少块? 示例 1: 输入: arr = [5,4,3,2,1] 输出: 1 解释: 将数组分成2块或者更多块,都无法得到所需的结果。 例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5, 1, 2, 3],这不是有序的数组。 示例 2: 输入: arr = [2,1,3,4,4] 输出: 4 解释: 我们可以把它分成两块,例如 [2, 1], [3, 4, 4]。 然而分成 [2, 1], [3], [4], [4] 可以得到最多的块数。 测试链接 : https://leetcode.com/problems/max-chunks-to-make-sorted-ii/ 给你两个整数 m 和 n ,分别表示一块矩形木块的高和宽。 同时给你一个二维整数数组 prices ,其中 prices[i] = [hi, wi, pricei]  表示你可以以 pricei 元的价格卖一块高为 hi 宽为 wi 的矩形木块。 每一次操作中,你必须按下述方式之一执行切割操作,以得到两块更小的矩形木块: 沿垂直方向按高度 完全 切割木块,或 沿水平方向按宽度 完全 切割木块 在将一块木块切成若干小木块后,你可以根据 prices 卖木块。 你可以卖多块同样尺寸的木块。 你不需要将所有小木块都卖出去。 你 不能 旋转切好后木块的高和宽。 请你返回切割一块大小为 m x n 的木块后,能得到的 最多 钱数。 注意你可以切割木块任意次。 测试链接 : https://leetcode.cn/problems/selling-pieces-of-wood/ Range模块是跟踪数字范围的模块。 设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。 半开区间 [left, right) 表示所有 left <= x < right 的实数 x 。 实现 RangeModule 类: RangeModule() 初始化数据结构的对象 void addRange(int left, int right) : 添加 半开区间 [left, right),跟踪该区间中的每个实数。 添加与当前跟踪的数字部分重叠的区间时, 应当添加在区间 [left, right) 中尚未跟踪的任何数字到该区间中。 boolean queryRange(int left, int right) : 只有在当前正在跟踪区间 [left, right) 中的每一个实数时,才返回 true 否则返回 false 。 void removeRange(int left, int right) : 停止跟踪 半开区间 [left, right) 中当前正在跟踪的每个实数。 测试连接 : https://leetcode.com/problems/range-module/ 一个字符串s,表示仓库的墙 与 货物,其中'|'表示墙,'*'表示货物。 给定一个起始下标start和一个终止下标end, 找出子串中 被墙包裹的货物 数量 比如 s = "|**|**|*" start = 1, end = 7 start和end截出的子串是 "**|**|*" 被 '|'包裹的 '*' 有两个,所以返回2 现在给定一系列的start,startIndices[],和对应一系列的end ,endIndices[] 返回每一对[start,end]的截出来的货物数量 数据规模: 字符串s长度<=10^5 startIndices长度 == endIndices长度 <=10^5 第029节 2022年6月第4周流行算法题目解析 给定字符串 S and T,找出 S 中最短的(连续)子串 W ,使得 T 是 W 的 子序列 。 如果 S 中没有窗口可以包含 T 中的所有字符,返回空字符串 ""。 如果有不止一个最短长度的窗口,返回开始位置最靠左的那个。 示例 1: 输入: S = "abcdebdde", T = "bde" 输出:"bcde" 解释: "bcde" 是答案,因为它在相同长度的字符串 "bdde" 出现之前。 "deb" 不是一个更短的答案,因为在窗口中必须按顺序出现 T 中的元素。 测试链接 : https://leetcode.cn/problems/minimum-window-subsequence/ 来自微软 请设计一种叫做“栈的管理器”的结构,实现如下6个功能 1) void createNewStack() : 可以在该结构中生成一个栈结构,编号从0开始 2) void push(int num, int stackIndex) : 将编号为stackIndex的栈里,压入num 3) int pop(int stackIndex) : 从编号为stackIndex的栈里,弹出栈顶返回 4) int peek(int stackIndex) :从编号为stackIndex的栈里,返回栈顶但是不弹出 5) boolean isEmpty(int statckIndex):返回编号为stackIndex的栈是否为空 6) int stackSize() : 返回一共生成了多少个栈 要求:不管用户调用多少次上面的方法,只使用有限几个动态数组(常数个),完成代码实现 有n个动物重量分别是a1、a2、a3.....an, 这群动物一起玩叠罗汉游戏, 规定从左往右选择动物,每只动物左边动物的总重量不能超过自己的重量 返回最多能选多少个动物,求一个高效的算法。 比如有7个动物,从左往右重量依次为:1,3,5,7,9,11,21 则最多能选5个动物:1,3,5,9,21 注意本题给的例子是有序的,但是实际给定的动物数组,可能是无序的, 要求从左往右选动物,且不能打乱原始数组 整数数组 stations 表示 水平数轴 上各个加油站的位置。给你一个整数 k 。 请你在数轴上增设 k 个加油站, 新增加油站可以位于 水平数轴 上的任意位置,而不必放在整数位置上。 设 penalty() 是:增设 k 个新加油站后,相邻 两个加油站间的最大距离。 请你返回 penalty() 可能的最小值。与实际答案误差在 10-6 范围内的答案将被视作正确答案。 测试链接 : https://leetcode.cn/problems/minimize-max-distance-to-gas-station/ 第030节 2022年7月第1周流行算法题目解析 来自真实笔试 给定一个二维数组matrix,数组中的每个元素代表一棵树的高度。 你可以选定连续的若干行组成防风带,防风带每一列的防风高度为这一列的最大值 防风带整体的防风高度为,所有列防风高度的最小值。 比如,假设选定如下三行 1 5 4 7 2 6 2 3 4 1、7、2的列,防风高度为7 5、2、3的列,防风高度为5 4、6、4的列,防风高度为6 防风带整体的防风高度为5,是7、5、6中的最小值 给定一个正数k,k <= matrix的行数,表示可以取连续的k行,这k行一起防风。 求防风带整体的防风高度最大值 给定一个棵树 树上每个节点都有自己的值,记录在数组nums里 比如nums[4] = 10,表示4号点的值是10 给定树上的每一条边,记录在二维数组edges里 比如edges[8] = {4, 9}表示4和9之间有一条无向边 可以保证输入一定是一棵树,只不过边是无向边 那么我们知道,断掉任意两条边,都可以把整棵树分成3个部分。 假设是三个部分为a、b、c a部分的值是:a部分所有点的值异或起来 b部分的值是:b部分所有点的值异或起来 c部分的值是:c部分所有点的值异或起来 请问怎么分割,能让最终的:三个部分中最大的异或值 - 三个部分中最小的异或值,最小 返回这个最小的差值 测试链接 : https://leetcode.cn/problems/minimum-score-after-removals-on-a-tree/ 在第 1 天,有一个人发现了一个秘密。 给你一个整数 delay ,表示每个人会在发现秘密后的 delay 天之后, 每天 给一个新的人 分享 秘密。 同时给你一个整数 forget ,表示每个人在发现秘密 forget 天之后会 忘记 这个秘密。 一个人 不能 在忘记秘密那一天及之后的日子里分享秘密。 给你一个整数 n ,请你返回在第 n 天结束时,知道秘密的人数。 由于答案可能会很大,请你将结果对 10^9 + 7 取余 后返回。 测试链接 : https://leetcode.cn/problems/number-of-people-aware-of-a-secret/ 第031节 2022年7月第2周流行算法题目解析 给定一个字符串 s,计算 s 的 不同非空子序列 的个数 因为结果可能很大,所以返回答案需要对 10^9 + 7 取余 。 字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符 但不改变剩余字符相对位置的一个新字符串。 本题来自大厂刷题班17节 但是为了讲述一个最新题目,不得不重提这个题 本题测试链接 : https://leetcode.com/problems/distinct-subsequences-ii/ 来自SnowFlake 给定一个正数n,比如6 表示数轴上有 0,1,2,3,4,5,6 <0 或者 >6 的位置认为无法到达 给定两个数字x和y,0<= x,y <= n 表示小人一开始在x的位置,它的目的地是y的位置,比如x = 1, y = 3 给定一个字符串s,比如 : rrlrlr 任何一个s的子序列,对应着一种运动轨迹,r表示向右,l表示向左 比如一开始小人在1位置,"rlr"是s的一个子序列 那么运动轨迹是:1 -> 2 -> 1 -> 2 求,s中有多少个字面值不同的子序列,能让小人从x走到y, 走的过程中完全不走出0到n的区域。 比如,s = "rrlrlr", n = 6, x = 1, y = 3 有如下5个字面值不同的子序列 rr : 1 -> 2 -> 3 rrlr : 1 -> 2 -> 3 -> 2 -> 3 rrrl : 1 -> 2 -> 3 -> 4 -> 3 rlrr : 1 -> 2 -> 1 -> 2 -> 3 rrlrlr : 1 -> 2 -> 3 -> 2 -> 3 -> 2 -> 3 注意:一定要是字面值不同的子序列!相同字面值的子序列算一种 比如s中,有很多个rr的子序列,但是算一个 数据规模 : s串长度 <= 1000, x,y,n <= 2500 在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时,在时间为 t 时,水池中的水位为 t 。 你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。 假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。 当然,在你游泳的时候你必须待在坐标方格里面。 你从坐标方格的左上平台 (0,0) 出发。 返回 你到达坐标方格的右下平台 (n-1, n-1) 所需的最少时间 。 测试链接 :https://leetcode.cn/problems/swim-in-rising-water 给定员工的 schedule 列表,表示每个员工的工作时间。 每个员工都有一个非重叠的时间段  Intervals 列表,这些时间段已经排好序。 返回表示 所有 员工的 共同,正数长度的空闲时间 的有限时间段的列表,同样需要排好序。 测试链接 : https://leetcode.cn/problems/employee-free-time/ 我们给出了一个(轴对齐的)二维矩形列表 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标 (xi1, yi1) 是该矩形 左下角 的坐标, (xi2, yi2) 是该矩形 右上角 的坐标。 计算平面中所有 rectangles 所覆盖的 总面积 。 任何被两个或多个矩形覆盖的区域应只计算 一次 。 返回 总面积 。因为答案可能太大,返回 10^9 + 7 的 模 。 Leetcode测试链接 : https://leetcode.cn/problems/rectangle-area-ii/ 洛谷测试链接 : https://www.luogu.com.cn/problem/P5490 第032节 2022年7月第3周流行算法题目解析 一个整数区间 [a, b]  ( a < b ) 代表着从 a 到 b 的所有连续整数,包括 a 和 b。 给你一组整数区间intervals,请找到一个最小的集合 S, 使得 S 里的元素与区间intervals中的每一个整数区间都至少有2个元素相交。 输出这个最小集合S的大小。 测试链接 : https://leetcode.cn/problems/set-intersection-size-at-least-two/ 来自蔚来汽车 给定一个只包含三种字符的字符串:( 、) 和 *, 写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ) 任何右括号 ) 必须有相应的左括号 ( 左括号 ( 必须在对应的右括号之前 ) * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符。 一个空字符串也被视为有效字符串。 测试链接 : https://leetcode.cn/problems/valid-parenthesis-string/ 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。 要求时间复杂度O(N) 测试链接 : https://leetcode.cn/problems/top-k-frequent-elements/ 特殊的二进制序列是具有以下两个性质的二进制序列: 0 的数量与 1 的数量相等。 二进制序列的每一个前缀码中 1 的数量要大于等于 0 的数量。 给定一个特殊的二进制序列 S,以字符串形式表示。 定义一个操作 为首先选择 S 的两个连续且非空的特殊的子串,然后将它们交换。 (两个子串为连续的当且仅当第一个子串的最后一个字符恰好为第二个子串的第一个字符的前一个字符) 在任意次数的操作之后,交换后的字符串按照字典序排列的最大的结果是什么? 测试链接 : https://leetcode.cn/problems/special-binary-string/ 第033节 2022年7月第4周流行算法题目解析 一个数组如果满足 : 升降升降升降... 或者 降升降升...都是满足的 给定一个数组, 1,看有几种方法能够剔除一个元素,达成上述的要求 2,数组天然符合要求返回0 3,剔除1个元素达成不了要求,返回-1, 比如: 给定[3, 4, 5, 3, 7],返回3 移除0元素,4 5 3 7 符合 移除1元素,3 5 3 7 符合 移除2元素,3 4 3 7 符合 再比如:给定[1, 2, 3, 4] 返回-1 因为达成不了要求 你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。 如果你能拼出正方形,则返回 true ,否则返回 false 。 测试链接 : https://leetcode.cn/problems/matchsticks-to-square/ 给你一个整数数组 nums 。如果 nums 的一个子集中, 所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积,那么我们称它为 好子集 。 比方说,如果 nums = [1, 2, 3, 4] : [2, 3] ,[1, 2, 3] 和 [1, 3] 是 好 子集,乘积分别为 6 = 2*3 ,6 = 2*3 和 3 = 3 。 [1, 4] 和 [4] 不是 好 子集,因为乘积分别为 4 = 2*2 和 4 = 2*2 。 请你返回 nums 中不同的 好 子集的数目对 109 + 7 取余 的结果。 nums 中的 子集 是通过删除 nums 中一些(可能一个都不删除,也可能全部都删除) 元素后剩余元素组成的数组。 如果两个子集删除的下标不同,那么它们被视为不同的子集。 测试链接 : https://leetcode.cn/problems/the-number-of-good-subsets/ 第034节 2022年8月第1周流行算法题目解析 在一个 2 * 3 的板上(board)有 5 块砖瓦,用数字 1~5 来表示, 以及一块空缺用 0 来表示。一次 移动 定义为选择 0 与一个相邻的数字(上下左右)进行交换. 最终当板 board 的结果是 [[1,2,3],[4,5,0]] 谜板被解开。 给出一个谜板的初始状态 board , 返回最少可以通过多少次移动解开谜板,如果不能解开谜板,则返回 -1 。 测试链接 : https://leetcode.cn/problems/sliding-puzzle/ 找到数组中的水王数 本题来自,大厂刷题班,23节 为了讲述下一个题,才重新讲述这个题 比较简单 设计一个数据结构,有效地找到给定子数组的 多数元素 。 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。 实现 MajorityChecker 类: MajorityChecker(int[] arr)  会用给定的数组 arr 对 MajorityChecker 初始化。 int query(int left, int right, int threshold)  返回子数组中的元素  arr[left...right] 至少出现 threshold 次数, 如果不存在这样的元素则返回 -1。 为了让同学们听懂这个题 才安排的水王问题重讲 测试链接 : https://leetcode.cn/problems/online-majority-element-in-subarray/ 给你一个长度为 n 的整数数组 rolls 和一个整数 k 。 你扔一个 k 面的骰子 n 次,骰子的每个面分别是 1 到 k , 其中第 i 次扔得到的数字是 rolls[i] 。 请你返回 无法 从 rolls 中得到的 最短 骰子子序列的长度。 扔一个 k 面的骰子 len 次得到的是一个长度为 len 的 骰子子序列 。 注意 ,子序列只需要保持在原数组中的顺序,不需要连续。 测试链接 : https://leetcode.cn/problems/shortest-impossible-sequence-of-rolls/ 给定一个只由小写字母和数字字符组成的字符串str 要求子串必须只含有一个小写字母,数字字符数量随意 求这样的子串最大长度是多少 栈只提供push、pop、isEmpty三个方法 请完成无序栈的排序,要求排完序之后,从栈顶到栈底从小到大 只能使用栈提供的push、pop、isEmpty三个方法、以及递归函数 除此之外不能使用任何的容器,任何容器都不许,连数组也不行 也不能自己定义任何结构体 就是只用: 1) 栈提供的push、pop、isEmpty三个方法 2) 简单返回值的递归函数 第035节 2022年8月第2周流行算法题目解析 来自猿辅导 2022.8.7笔试第三道 给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果arr[i] != 0,表示i这里已经确定是左括号,颜色就是arr[i]的值 那么arr整体就可以变成某个括号字符串,并且每个括号字符都带有颜色 返回在括号字符串合法的前提下,有多少种不同的染色方案 不管是排列、还是颜色,括号字符串任何一点不一样,就算不同的染色方案 最后的结果%10001,为了方便,我们不处理mod,就管核心思路 2 <= arr长度 <= 5000 1 <= k <= 1000 0 <= arr[i] <= k 来自米哈游 给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边 edges一定表示的是一个无环无向图,也就是树结构 每个节点可以染1、2、3三种颜色 要求 : 非叶节点的相邻点一定要至少有两种和自己不同颜色的点 返回一种达标的染色方案,也就是一个数组,表示每个节点的染色状况 1 <= 节点数量 <= 10的5次方 给定一个逆波兰式 转化成正确的中序表达式 要求只有必要加括号的地方才加括号 给定平面上n个点,x和y坐标都是整数 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 返回最短距离,精确到小数点后面4位 测试链接 : https://www.luogu.com.cn/problem/P1429 第036节 2022年8月第3周流行算法题目解析 给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 , 其中每个节点 至多 有一条出边。 图用一个大小为 n 下标从 0 开始的数组 edges 表示, 节点 i 到节点 edges[i] 之间有一条有向边。 如果节点 i 没有出边,那么 edges[i] == -1 。 请你返回图中的 最长 环,如果没有任何环,请返回 -1 。 一个环指的是起点和终点是 同一个 节点的路径。 测试链接 : https://leetcode.cn/problems/longest-cycle-in-a-graph/ 来自学员问题 给定怪兽的血量为hp 第i回合如果用刀砍,怪兽在这回合会直接掉血,没有后续效果 第i回合如果用毒,怪兽在这回合不会掉血, 但是之后每回合都会掉血,并且所有中毒的后续效果会叠加 给定的两个数组cuts、poisons,两个数组等长,长度都是n 表示你在n回合内的行动, 每一回合的刀砍的效果由cuts[i]表示 每一回合的中毒的效果由poisons[i]表示 如果你在n个回合内没有直接杀死怪兽,意味着你已经无法有新的行动了 但是怪兽如果有中毒效果的话,那么怪兽依然会在hp耗尽的那回合死掉 返回你最快能在多少回合内将怪兽杀死 数据范围 : 1 <= n <= 10的5次方 1 <= hp <= 10的9次方 1 <= cuts[i]、poisons[i] <= 10的9次方 设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素。 实现 MaxStack 类: MaxStack() 初始化栈对象 void push(int x) 将元素 x 压入栈中。 int pop() 移除栈顶元素并返回这个元素。 int top() 返回栈顶元素,无需移除。 int peekMax() 检索并返回栈中最大元素,无需移除。 int popMax() 检索并返回栈中最大元素,并将其移除。 如果有多个最大元素,只要移除 最靠近栈顶 的那个。 测试链接 : https://leetcode.cn/problems/max-stack/ 这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings , 表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。 请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。 测试链接 : https://leetcode.cn/problems/corporate-flight-bookings/ 给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调, 例如,数组为 nums = [2,4,1,3,0], 我们按 k = 2 进行轮调后,它将变成 [1,3,0,2,4]。 这将记为 3 分, 因为 1 > 0 [不计分]、3 > 1 [不计分]、0 <= 2 [计 1 分]、 2 <= 3 [计 1 分],4 <= 4 [计 1 分]。 在所有可能的轮调中,返回我们所能得到的最高分数对应的轮调下标 k 。 如果有多个答案,返回满足条件的最小的下标 k 。 测试链接 : https://leetcode.cn/problems/smallest-rotation-with-highest-score/ 第037节 2022年8月第4周流行算法题目解析 来自神策 给定一个数组arr,表示连续n天的股价,数组下标表示第几天 指标X:任意两天的股价之和 - 此两天间隔的天数 比如 第3天,价格是10 第9天,价格是30 那么第3天和第9天的指标X = 10 + 30 - (9 - 3) = 34 返回arr中最大的指标X 来自美团 8.20笔试 小团生日收到妈妈送的两个一模一样的数列作为礼物! 他很开心的把玩,不过不小心没拿稳将数列摔坏了! 现在他手上的两个数列分别为A和B,长度分别为n和m。 小团很想再次让这两个数列变得一样。他现在能做两种操作: 操作一是将一个选定数列中的某一个数a改成数b,这会花费|b-a|的时间, 操作二是选择一个数列中某个数a,将它从数列中丢掉,花费|a|的时间。 小团想知道,他最少能以多少时间将这两个数列变得再次相同! 输入描述: 第一行两个空格隔开的正整数n和m,分别表示数列A和B的长度。 接下来一行n个整数,分别为A1 A2…An 接下来一行m个整数,分别为B1 B2…Bm 对于所有数据,1 ≤ n,m ≤ 2000, |Ai|,|Bi| ≤ 10000 输出一行一个整数,表示最少花费时间,来使得两个数列相同。 来自美团 题目1 8.20笔试 小美将要期中考试,有n道题,对于第i道题, 小美有pi的几率做对,获得ai的分值,还有(1-pi)的概率做错,得0分。 小美总分是每道题获得的分数。 小美不甘于此,决定突击复习,因为时间有限,她最多复习m道题,复习后的试题正确率为100%。 如果以最佳方式复习,能获得期望最大总分是多少? 输入n、m 接下来输入n个整数,代表pi%,为了简单期间,将概率扩大了100倍。 接下来输入n个整数,代表ai,某道题的分值 输出最大期望分值,精确到小数点后2位 数据 1m<=n<=50000 简单题, 课上提一下解法即可 题目2 小团在地图上放了3个定位装置,想依赖他们进行定位! 地图是一个n*n的棋盘, 有3个定位装置(x1,y1),(x2,y2),(x3,y3),每个值均在[1,n]内。 小团在(a,b)位置放了一个信标, 每个定位装置会告诉小团它到信标的曼哈顿距离,也就是对于每个点,小团知道|xi-a|+|yi-b| 求信标位置,信标不唯一,输出字典序最小的。 输入n,然后是3个定位装置坐标, 最后是3个定位装置到信标的曼哈顿记录。 输出最小字典序的信标位置。 1 <= 所有数据值 <= 50000 来自微软 给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如 : 39878,能拼出的最大回文数是 : 898 00900,能拼出的最大回文数是 : 9 54321,能拼出的最大回文数是 : 5 最终的结果以字符串形式返回 str的长度为N,1 <= N <= 100000 测试链接 : https://leetcode.cn/problems/largest-palindromic-number/ 来自微软 给定两个数组A和B,比如 A = { 0, 1, 1 } B = { 1, 2, 3 } A[0] = 0, B[0] = 1,表示0到1有双向道路 A[1] = 1, B[1] = 2,表示1到2有双向道路 A[2] = 1, B[2] = 3,表示1到3有双向道路 给定数字N,编号从0~N,所以一共N+1个节点 题目输入一定保证所有节点都联通,并且一定没有环 默认办公室是0节点,其他1~N节点上,每个节点上都有一个居民 每天所有居民都去往0节点上班 所有的居民都有一辆5座的车,也都乐意和别人一起坐车 车不管负重是多少,只要走过一条路,就耗费1的汽油 比如A、B、C的居民,开着自己的车来到D居民的位置,一共耗费3的汽油 D居民和E居民之间,假设有一条路 那么D居民可以接上A、B、C,4个人可以用一辆车,去往E的话,就再耗费1的汽油 求所有居民去办公室的路上,最少耗费多少汽油 来自网易 小红拿到了一个仅由r、e、d组成的字符串 她定义一个字符e为"好e" : 当且仅当这个e字符和r、d相邻 例如"reeder"只有一个"好e",前两个e都不是"好e",只有第三个e是"好e" 小红每次可以将任意字符修改为任意字符,即三种字符可以相互修改 她希望"好e"的数量尽可能多 小红想知道,自己最少要修改多少次 输入一个只有r、e、d三种字符的字符串 长度 <= 2 * 10^5 输出最小修改次数