diff --git "a/\347\256\227\346\263\225\345\222\214\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\242\263\347\220\206.xmind" "b/\347\256\227\346\263\225\345\222\214\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\242\263\347\220\206.xmind" index d69d8fb..37630b4 100644 Binary files "a/\347\256\227\346\263\225\345\222\214\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\242\263\347\220\206.xmind" and "b/\347\256\227\346\263\225\345\222\214\346\225\260\346\215\256\347\273\223\346\236\204\347\237\245\350\257\206\346\242\263\347\220\206.xmind" differ diff --git "a/\350\257\276\345\240\202\345\206\205\345\256\271\346\261\207\346\200\273/\346\257\217\345\221\250\346\234\211\350\220\245\345\205\273\347\232\204\345\244\247\345\216\202\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230(\346\255\243\345\234\250\347\233\264\346\222\255)" "b/\350\257\276\345\240\202\345\206\205\345\256\271\346\261\207\346\200\273/\346\257\217\345\221\250\346\234\211\350\220\245\345\205\273\347\232\204\345\244\247\345\216\202\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230(\346\255\243\345\234\250\347\233\264\346\222\255)" index 822c0be..43bbcaf 100644 --- "a/\350\257\276\345\240\202\345\206\205\345\256\271\346\261\207\346\200\273/\346\257\217\345\221\250\346\234\211\350\220\245\345\205\273\347\232\204\345\244\247\345\216\202\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230(\346\255\243\345\234\250\347\233\264\346\222\255)" +++ "b/\350\257\276\345\240\202\345\206\205\345\256\271\346\261\207\346\200\273/\346\257\217\345\221\250\346\234\211\350\220\245\345\205\273\347\232\204\345\244\247\345\216\202\347\256\227\346\263\225\351\235\242\350\257\225\351\242\230(\346\255\243\345\234\250\347\233\264\346\222\255)" @@ -3675,6 +3675,570 @@ v是中心点,依次打印 : v u o p q w .... +第070节 2023年5月第4周流行算法题目解析 + +先来一个智力题,来自美团面试题 +给定n个二维坐标,表示在二维平面的n个点, +坐标为double类型,精度最多小数点后两位 +希望在二维平面上画一个圆,圈住其中的k个点,其他的n-k个点都要在圆外 +返回一个圆心和半径,表示哪个圆可以圈住其中的k个点 +坐标和半径都是double类型,最多保留小数点后两位 +下面是正式题目 +给你一个整数数组 arr 和一个整数 k +现需要从数组中恰好移除 k 个元素 +请找出移除后数组中不同整数的最少数目 +测试链接 : https://leetcode.cn/problems/least-number-of-unique-integers-after-k-removals/ + +来自华为 +一个数字n,一定要分成k份 +得到的乘积尽量大是多少 +数字n和k,可能非常大,到达10^12规模 +结果可能更大,所以返回结果对1000000007取模 + +来自美团 +给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, +只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时, +返回 true;否则,返回 false 。 +测试链接 : https://leetcode.cn/problems/validate-stack-sequences/ + +来自招商银行 +给定一个数组arr,长度为n,表示有0~n-1号设备 +arr[i]表示i号设备的型号,型号的种类从0~k-1,一共k种型号 +给定一个k*k的矩阵map,来表示型号之间的兼容情况 +map[a][b] == 1,表示a型号兼容b型号 +map[a][b] == 0,表示a型号不兼容b型号 +兼容关系是有向图,也就是a型号兼容b型号,不代表b型号同时兼容a型号 +如果i设备的型号兼容j设备的型号,那么可以从i设备修建一条去往j设备的线路 +修建线路的代价是i设备到j设备的距离:|i-j| +你的目标是从0号设备到达n-1号设备,并不一定每个设备都联通,只需要到达即可 +返回最小的修建代价,如果就是无法到达返回-1 +1 <= n <= 1000 +1 <= k <= 50 + +来自招商银行 +这个题是个破题,但这可能是经常遇到的一种题, +讲一下思路即可,没有必要投入大多时间给这种题目 +一共有三个服务A、B、C,网络延时分别为a、b、c +并且一定有:1 <= a <= b <= c <= 10^9 +但是具体的延时数字丢失了,只有单次调用的时间 +一次调用不可能重复使用相同的服务, +一次调用可能使用了三个服务中的某1个、某2个或者全部3个服务 +比如一个调用的时间,T = 100 +100的延时可能来自以下7种情况: +a = 100,这次调用可能单独使用了A +b = 100,这次调用可能单独使用了B +c = 100,这次调用可能单独使用了C +a + b = 100,这次调用可能组合使用了A、B +a + c = 100,这次调用可能组合使用了A、C +b + c = 100,这次调用可能组合使用了B、C +a + b + c = 100,这次调用可能组合使用了A、B、C全部服务 +那么可想而知,如果给的调用时间足够多,是可以猜测出a、b、c的 +给定一个数组times,长度为n,并且一定有4 <= n <= 7 +times[i] = s,表示i号调用用时s,而且times中一定都是正数且没有重复值 +请根据n次调用,猜测出a、b、c三元组可能的情况数 +如果任何a、b、c都无法匹配上给定的调用耗时,返回0 +测试的次数T <= 100 +也就是说,一共最多给定100个数组,每一次让你返回a、b、c三元组可能的情况数 + +来自招商银行 +原始题目描述 +假如某公司目前推出了N个在售的金融产品(1<=N<=100) +对于张三,用ai表示他购买了ai(0<=ai<=10^4)份额的第i个产品(1<=i<=N) +现给出K(1<=K<=N)个方案,通过这些方案,能够支持将多个不同的产品进行整合 +(也可以对单个产品进行优化)形成新的产品。 +新的产品形成后,若用户持有了组成新产品所需的全部的原产品份额, +则能够将用户持有的原产品份额转换为新产品的份额,各原产品份额与新产品份额比例均为1:1 +我们保证对于每个产品最多存在一个方案使用旧产品整合成该产品 +并且根据方案产出的新产品的产品编号均大于各旧产品的产品编号 +现计划根据这些方案,帮助部分愿意升级到最新产品的用户对产品进行升级 +请协助工作人员计算当前用户能够转换出的最新产品份额的最大值 +输入描述 +第一行包含整数N,第二行包含N个整数ai,第三行包含整数K +接下来的K行,每一行代表一个方案,每一行包含整数1和M(M>=1) +L为该方案产生的新产品的编号,M代表方案所需原产品个数 +接下来的M个整数代表了该方案所需的每个原产品的个数 +输出描述 +根据日前的份额和给出的方案,经过若干次转换,输出当前用户能够得到产品N的份额最大值 +举例 +输入: +5 +2 0 0 1 0 +3 +5 2 3 4 +2 1 1 +3 1 2 +输出: +1 +解释: +第一步将1份1产品转化为1份2产品 +第二步将1份2产品转化为1份3产品 +第三步将1份3产品和1份4产品,转成为1份5产品 +然后不能得到更多的5产品了,所以返回1 +实在是太困惑了,上文说的意思可谓不做人,那么我们改写一下意思,变得好理解 +如下是改写后的题目描述 +给定一个数组arr,长度为n,产品编号从0~n-1 +arr[i]代表初始时i号产品有多少份 +存在一系列的产品转化方案的数组convert,长度为k,代表k个方案 +比如具体某一个方案,convert[j] = {a, b, c, d, ...} +表示当前的j号方案转化出来的产品是a,转化1份a需要:1份b、1份c、1份d... +其中a、b、c、d...一定都在0~n-1范围内 +并且题目保证a > Math.max(b, c, d, ....) +而且题目保证所有方案转化出来的产品编号一定是不重复的 +请返回最终能得到的第n-1号商品的最大值 +1 <= n <= 100 +0 <= arr[i] <= 10^4 +k < n + + + +第071节 2023年5月第5周流行算法题目解析 + +来自字节 +给定一个n*m的二维矩阵,每个位置都是字符 +U、D、L、R表示传送带的位置,会被传送到 : 上、下、左、右 +. 、O分别表示空地、目标,一定只有一个目标点 +可以在空地上选择上、下、左、右四个方向的一个 +到达传送带的点会被强制移动到其指向的下一个位置 +如果越界直接结束,返回有几个点可以到达O点 + +来自学员问题 +沿街有一排连续的房屋。每间房屋内都藏有一定的现金 +现在有一位小偷计划从这些房屋中窃取现金 +由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 +小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额 +给你一个整数数组 nums 表示每间房屋存放的现金金额 +形式上,从左起第 i 间房屋中放有 nums[i] 美元 +另给你一个整数 k ,表示窃贼将会窃取的最少房屋数 +小偷一定要要窃取至少 k 间房屋,返回小偷的 最小 窃取能力 +测试链接 : https://leetcode.cn/problems/house-robber-iv/ + +来自华为OD +如果n = 1,打印 +1*** +如果n = 2,打印 + 1*** +3*** 2*** +如果n = 3,打印 + 1*** + 3*** 2*** +4*** 5*** 6*** +如果n = 4,打印 + 1*** + 3*** 2*** + 4*** 5*** 6*** +10** 9*** 8*** 7*** +输入一个数n,表示有多少行,从1开始输出, +奇数行输出奇数个数,奇数行正序,偶数行输出偶数个数,偶数行逆序 +每个数后面加*补满四位,中间空4个,第n行顶格输出 + +字符串哈希原理和实现 + +字符串哈希+二分的例题 +给定长为 n 的源串 s,以及长度为 m 的模式串 p, +要求查找源串中有多少子串与模式串匹配 +s' 与 s 匹配,当且仅当 s' 与 s 长度相同,且最多有 k 个位置字符不同 +其中 1 <= n, m <= 10^6,0 <= k <= 5 + +正方形矩阵哈希实现 +二维哈希只适用于正方形的情况 +如果想支持普通矩阵,需要更复杂度的过程,这里不做展开 + +如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像 +那么称这个正方形矩阵叫做神奇矩阵 +比如 : +1 5 5 1 +6 3 3 6 +6 3 3 6 +1 5 5 1 +这个正方形矩阵就是神奇矩阵 +给定一个大矩阵n*m,返回其中神奇矩阵的数目 +1 <= n,m <= 1000 +测试链接 : https://www.luogu.com.cn/problem/P2601 + + + +第072节 2023年6月第2周流行算法题目解析 + +给你一个长度为 n 下标从 0 开始的整数数组 nums +它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 +如果一个四元组 (i, j, k, l) 满足以下条件,我们称它是上升的: +0 <= i < j < k < l < n 且 +nums[i] < nums[k] < nums[j] < nums[l] 。 +测试链接 : https://leetcode.cn/problems/count-increasing-quadruplets/ + +来自华为od +给定一个数组arr,长度为n,表示n个格子的分数,并且这些格子首尾相连 +孩子不能选相邻的格子,不能回头选,不能选超过一圈 +但是孩子可以决定从任何位置开始选,也可以什么都不选 +返回孩子能获得的最大分值 +1 <= n <= 10^6 +0 <= arr[i] <= 10^6 + +给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次 +需保证 返回结果的字典序最小 +要求不能打乱其他字符的相对位置) +测试链接 : https://leetcode.cn/problems/remove-duplicate-letters/ +大厂刷题班讲过,不过那时没有讲出最优解,安排一下重讲 + +给你一个由 n 个数对组成的数对数组 pairs +其中 pairs[i] = [lefti, righti] 且 lefti < righti 。 +现在,我们定义一种 跟随 关系,当且仅当 b < c 时 +数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面 +我们用这种形式来构造 数对链 +找出并返回能够形成的 最长数对链的长度 +你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。 +测试链接 : https://leetcode.cn/problems/maximum-length-of-pair-chain/ + +给你两个整数数组 arr1 和 arr2 +返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。 +每一步「操作」中,你可以分别从 arr1 和 arr2 中各选出一个索引, +分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length, +然后进行赋值运算 arr1[i] = arr2[j]。如果无法让 arr1 严格递增,请返回 -1。 +之前讲过这个题,能通过但不是最优解,所以我们直接补一个最优解 +测试链接 : https://leetcode.cn/problems/make-array-strictly-increasing/ + + + +第073节 2023年6月3周流行算法题目解析 + +课前放松一下 +做一个令人不开心的实验 +一开始有100个人,每个人都有100元 +在每一轮都做如下的事情 : +每个人都必须拿出1元钱给除自己以外的其他人,给谁完全随机 +如果某个人在这一轮的钱数为0,那么他可以不给,但是可以接收 +发生很多很多轮之后,这100人的社会财富分布很均匀吗? + +来自字节 +密码是一串长度为n的小写字母,一则关于密码的线索纸条 +首先将字母a到z编号为0到25编号 +纸条上共有n个整数ai,其中a1表示密码里第一个字母的编号 +若i>1的话就表示第i个字母和第i-1个字母编号的差值 +例如,a2就代表密码中第1个字母和第2个字母编号的差值 +若密码是acb,那么纸条上的数字就是[0, 2, 1] +返回可能的密码的个数,由于结果可能很大, +输出对1000000007取模的结果 +1 <= n <= 10^5 +0 <= ai <= 25 + +来自字节 +给定整数数组arr,求删除任一元素后, +新数组中长度为k的子数组累加和的最大值 + +来自字节 +给定一个数组arr,长度为n,在其中要选两个不相交的子数组 +两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少 +如果没有有效方法,返回-1 +正式 : +2 <= n <= 10^6 +0 <= arr[i] <= 10000 +1 <= T <= 10^8 +扩展 : +2 <= n <= 10^6 +-10000 <= arr[i] <= 10000 +1 <= T <= 10^8 +都能时间复杂度做到O(N) + +来自华为OD +一支n个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河 +敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭 +现在军队只找到了1只小船,这船最多能同时坐上2个士兵。 +1) 当1个士兵划船过河,用时为a[i] +2) 当2个士兵坐船同时划船过河时, 用时为max(a[j],a[i])两士兵中用时最长的 +3) 当2个士兵坐船只有1个士兵划船时, 用时为a[i] * 10, a[i]为划船士兵用时 +请帮忙给出一种解决方案,保证存活的士兵最多,且过河用时最短 +我们先看一下如下的题,再讲一下华为OD的扩展 +测试链接 : https://www.luogu.com.cn/problem/P1809 +有一个大晴天, Oliver与同学们一共N人出游, 他们走到一条河的东岸边,想要过河到西岸 +而东岸边有一条小船。船太小了,一次只能乘坐两人,每个人都有一个渡河时间T +船划到对岸的时间等于船上渡河时间较长的人所用时间 +现在已知N个人的渡河时间Ti +Oliver 想要你告诉他,他们最少要花费多少时间,才能使所有人都过河 +注意,只有船在东岸(西岸)的人才能坐上船划到对岸。 + +来自华为OD +1号店铺贿赂问题 +店铺数量n,编号1~n +人的数量m,编号1~m +每个人有自己投票的店铺p,和改投1号店的报价x +返回想让1号店铺成为人气最高的店,至少花多少钱 +1 <= p,n,m <= 3000 +1 <= x <= 10^9 + + + +第074节 2023年6月4周流行算法题目解析 + +给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数 +如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列 +对于 0 <= i < n - 1 的下标 i +要么 nums[i] % nums[i+1] == 0 +要么 nums[i+1] % nums[i] == 0 +请你返回特别排列的总数目,由于答案可能很大,请将它对 1000000007 取余 后返回 +测试链接 : https://leetcode.cn/problems/special-permutations/ + +给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time +分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠 +一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间 +开销为 cost[i] 单位的钱。 +一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0 +但是必须在付费油漆匠 工作 时,免费油漆匠才会工作 +请你返回刷完 n 堵墙最少开销为多少 +测试链接 : https://leetcode.cn/problems/painting-the-walls/ + +来自华为社招笔试 +在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧 +在桥上有一些石子,青蛙很讨厌踩在这些石子上 +由于桥的长度和青蛙一次跳过的距离都是正整数 +我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0...L +其中L是桥的长度,坐标为 0 的点表示桥的起点,坐标为 L 的点表示桥的终点 +青蛙从桥的起点开始,不停的向终点方向跳跃 +一次跳跃的距离是 S 到 T 之间的任意正整数(包括S,T) +当青蛙跳到或跳过坐标为 L 的点时,就算青蛙已经跳出了独木桥。 +题目给出独木桥的长度 L,青蛙跳跃的距离范围[S,T] +以及桥上石子的位置 +你的任务是确定青蛙要想过河,最少需要踩到的石子数 +测试链接 : https://www.luogu.com.cn/problem/P1052 + +欧拉路径问题 +给你一个下标从 0 开始的二维整数数组 pairs +其中 pairs[i] = [starti, endi] +如果 pairs 的一个重新排列 +满足对每一个下标 i ( 1 <= i < pairs.length ) +都有 endi-1 == starti , +那么我们就认为这个重新排列是 pairs 的一个 合法重新排列 +请你返回 任意一个 pairs 的合法重新排列 +注意:数据保证至少存在一个 pairs 的合法重新排列 +测试链接 : https://leetcode.cn/problems/valid-arrangement-of-pairs/ + + + +第075节 2023年7月1周流行算法题目解析 + +先来一个最近国外同学考的题目 +已知一些供应点的位置,一共n个供应点 +其中有n-1个供应点一定都在x轴上,比如(15,0)位置,(2,0)位置等 +只有1个供应点不在x轴上,比如(23,17)位置 +给出每个供应点的位置,并且给定第k号供应点是出发点 +要求每个供应点最多走过2次,返回从k点出发,走完所有供应点的最少距离 +上面这个题没有代码实现 +因为这个题就是彻底的业务分析,只有一系列的贪心设计,代码也不难写 +同时这个题没有给出数据量,但是课上会讲O(n)的方法,所以也就无所谓了 +以下是这节课的正式题,来自学员问题 +现在有一个打怪类型的游戏,这个游戏是这样的,你有n个技能 +每一个技能会有一个伤害, +同时若怪物小于等于一定的血量,则该技能可能造成双倍伤害 +每一个技能最多只能释放一次,已知怪物有m点血量 +现在想问你最少用几个技能能消灭掉他(血量小于等于0) +技能的数量是n,怪物的血量是m +i号技能的伤害是x[i],i号技能触发双倍伤害的血量最小值是y[i] +1 <= n <= 10 +1 <= m、x[i]、y[i] <= 10^6 +测试链接 : https://www.nowcoder.com/questionTerminal/d88ef50f8dab4850be8cd4b95514bbbd + +给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 +s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 +例如,如果 words = ["ab","cd","ef"] +那么 "abcdef", "abefcd","cdabef" +"cdefab","efabcd", 和 "efcdab" 都是串联子串 +"acdbef" 不是串联子串,因为他不是任何 words 排列的连接。 +返回所有串联字串在 s 中的开始索引 +你可以以 任意顺序 返回答案 +1 <= s.length <= 10^4 +1 <= words.length <= 5000 +1 <= words[i].length <= 30 +words[i] 和 s 由小写英文字母组成 +测试链接 : https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ + +小扣在探索丛林的过程中,无意间发现了传说中"落寞的黄金之都" +而在这片建筑废墟的地带中,小扣使用探测仪监测到了存在某种带有「祝福」效果的力场 +经过不断的勘测记录,小扣将所有力场的分布都记录了下来 +forceField[i] = [x,y,side] +表示第 i 片力场将覆盖以坐标 (x,y) 为中心,边长为 side 的正方形区域。 +若任意一点的 力场强度 等于覆盖该点的力场数量 +请求出在这片地带中 力场强度 最强处的 力场强度 +注意:力场范围的边缘同样被力场覆盖。 +测试链接 : https://leetcode.cn/problems/xepqZ5/ + +来自网易 +题目出处 : https://leetcode.cn/circle/discuss/uOnnUA/ +已知一个n*n的01矩阵, +只能通过通过行交换、或者列交换的方式调整矩阵, +判断这个矩阵的对角线是否能全为1,如果能返回true,不能返回false +我们升级一下: +已知一个n*n的01矩阵, +只能通过通过行交换、或者列交换的方式调整矩阵, +判断这个矩阵的对角线是否能全为1,如果不能打印-1 +如果能,打印需要交换的次数,并且打印怎么交换 +测试链接 : http://acm.hdu.edu.cn/showproblem.php?pid=2819 + + + +第076节 2023年7月2周流行算法题目解析 + +阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N堆金币 +第i堆金币的总重量和总价值分别是m[i]、v[i] +阿里巴巴有一个承重量为T的背包,但并不一定有办法将全部的金币都装进去 +他想装走尽可能多价值的金币 +所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变 +请问阿里巴巴最多可以拿走多少价值的金币? +测试链接 : https://www.luogu.com.cn/problem/P2240 + +来自字节 +机器人正在玩一个古老的基于DOS的游戏 +游戏中有N+1座建筑,从0到N编号,从左到右排列 +编号为0的建筑高度为0个单位,编号为i的建筑的高度为H(i)个单位 +起初, 机器人在编号为0的建筑处 +每一步,它跳到下一个(右边)建筑。假设机器人在第k个建筑,且它现在的能量值是E +下一步它将跳到第个k+1建筑 +它将会得到或者失去正比于与H(k+1)与E之差的能量 +如果 H(k+1) > E 那么机器人就失去H(k+1)-E的能量值,否则它将得到E-H(k+1)的能量值 +游戏目标是到达第个N建筑,在这个过程中,能量值不能为负数个单位 +现在的问题是机器人以多少能量值开始游戏,才可以保证成功完成游戏 +测试链接 : https://www.nowcoder.com/questionTerminal/7037a3d57bbd4336856b8e16a9cafd71 + +你有 k 个背包。给你一个下标从 0 开始的整数数组 weights +其中 weights[i] 是第 i 个珠子的重量。同时给你整数 k +请你按照如下规则将所有的珠子放进 k 个背包。 +没有背包是空的。 +如果第 i 个珠子和第 j 个珠子在同一个背包里 +那么下标在 i 到 j 之间的所有珠子都必须在这同一个背包中 +如果一个背包有下标从 i 到 j 的所有珠子,那么这个背包的价格是 weights[i] + weights[j] 。 +一个珠子分配方案的 分数 是所有 k 个背包的价格之和。 +请你返回所有分配方案中,最大分数 与 最小分数 的 差值 为多少。 +测试链接 : https://leetcode.cn/problems/put-marbles-in-bags/ + +一个公司准备组织一场会议,邀请名单上有 n 位员工 +公司准备了一张 圆形 的桌子,可以坐下 任意数目 的员工 +员工编号为 0 到 n - 1 。每位员工都有一位 喜欢 的员工 +每位员工 当且仅当 他被安排在喜欢员工的旁边,他才会参加会议 +每位员工喜欢的员工 不会 是他自己。 +给你一个下标从 0 开始的整数数组 favorite +其中 favorite[i] 表示第 i 位员工喜欢的员工。请你返回参加会议的 最多员工数目 +测试链接 : https://leetcode.cn/problems/maximum-employees-to-be-invited-to-a-meeting/ + +给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 +同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] +表示在 fromi 和 toi 节点之间有一条带权无向边 +最小生成树 (MST) 是给定图中边的一个子集 +它连接了所有节点且没有环,而且这些边的权值和最小 +请你找到给定图中最小生成树的所有关键边和伪关键边 +如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边 +伪关键边则是可能会出现在某些最小生成树中但不会出现在所有最小生成树中的边 +请注意,你可以分别以任意顺序返回关键边的下标和伪关键边的下标 +测试链接 : https://leetcode.cn/problems/find-critical-and-pseudo-critical-edges-in-minimum-spanning-tree/ + + + +第077节 2023年7月3周流行算法题目解析 + +先来一个最近学员在国外面试的题 +有一个由x轴和y轴组成的坐标系 +"y下"和"y上"表示一条无限延伸的道路,"y下"表示这个道路的下限,"y上"表示这个道路的上限 +给定一批长方形,每一个长方形有(x1, x2, y1, y2),4个坐标可以表示一个长方形 +判断这条道路整体是不是可以走通的 +以下为正式题目 +图片在计算机处理中往往是使用二维矩阵来表示的 +给你一个大小为 m x n 的二进制矩阵 image 表示一张黑白图片,0 代表白色像素,1 代表黑色像素 +黑色像素相互连接,也就是说,图片中只会有一片连在一块儿的黑色像素。像素点是水平或竖直方向连接的 +给你两个整数 x 和 y 表示某一个黑色像素的位置 +请你找出包含全部黑色像素的最小矩形(与坐标轴对齐),并返回该矩形的面积 +你必须设计并实现一个时间复杂度低于 O(m*n) 的算法来解决此问题。 +测试链接 : https://leetcode.cn/problems/smallest-rectangle-enclosing-black-pixels/ + +一个句子是由一些单词与它们之间的单个空格组成 +且句子的开头和结尾没有多余空格 +比方说,"Hello World" ,"HELLO" ,"hello world hello world" 都是句子 +每个单词都 只 包含大写和小写英文字母 +如果两个句子 sentence1 和 sentence2 +可以通过往其中一个句子插入一个任意的句子(可以是空句子)而得到另一个句子 +那么我们称这两个句子是 相似的 +比方说,sentence1 = "Hello my name is Jane" +且 sentence2 = "Hello Jane" +我们可以往 sentence2 中 "Hello" 和 "Jane" 之间插入 "my name is" +得到 sentence1 +给你两个句子 sentence1 和 sentence2 +如果 sentence1 和 sentence2 是相似的,请你返回 true ,否则返回 false +测试链接 : https://leetcode.cn/problems/sentence-similarity-iii/ + +每一种货币都给定面值val[i],和拥有的数量cnt[i] +想知道目前拥有的货币,在钱数为1、2、3...m时,能找零成功的钱数有多少 +也就是说当钱数的范围是1~m,返回这个范围上有多少可以找零成功的钱数 +比如只有3元的货币,数量是5张 +m = 10 +那么在1~10范围上,只有钱数是3、6、9时,可以成功找零 +所以返回3,表示有3种钱数可以找零成功 +测试链接 : http://poj.org/problem?id=1742 + +我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号 +每个栈的的最大容量 capacity 都相同。实现一个叫「餐盘」的类 DinnerPlates +DinnerPlates(int capacity) - 给出栈的最大容量 capacity +void push(int val) 将给出的正整数 val 推入 从左往右第一个 没有满的栈 +int pop() 返回 从右往左第一个 非空栈顶部的值,并将其从栈中删除 + 如果所有的栈都是空的,请返回 -1。 +int popAtStack(int index) - 返回编号 index 的栈顶部的值,并将其从栈中删除 + 如果编号 index 的栈是空的,请返回 -1。 +测试链接 : https://leetcode.cn/problems/dinner-plate-stacks/ + +给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先 +测试链接 : https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/ + + + +第078节 2023年7月4周流行算法题目解析 + +给你一个正整数数组 nums +每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半 +注意,在后续操作中你可以对减半过的数继续执行操作 +请你返回将 nums 数组和 至少 减少一半的 最少 操作数 +测试链接 : https://leetcode.cn/problems/minimum-operations-to-halve-array-sum/ + +自 01背包问世之后,小 A 对此深感兴趣 +一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组 +每组中的物品只能选择1件,现在他想知道最大的利用价值是多少 +测试链接 : www.luogu.com.cn/problem/P1757 + +一张桌子上总共有 n 个硬币 栈 。每个栈有 正整数 个带面值的硬币 +每一次操作中,你可以从任意一个栈的 顶部 取出 1 个硬币,从栈中移除它,并放入你的钱包里 +给你一个列表 piles ,其中 piles[i] 是一个整数数组 +分别表示第 i 个栈里 从顶到底 的硬币面值。同时给你一个正整数 k +请你返回在 恰好 进行 k 次操作的前提下,你钱包里硬币面值之和 最大为多少 +测试链接 : https://leetcode.cn/problems/maximum-value-of-k-coins-from-piles/ + +给你一个二进制字符串数组 strs 和两个整数 m 和 n +请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 +如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 +测试链接 : https://leetcode.cn/problems/ones-and-zeroes/ + +集团里有 n 名员工,他们可以完成各种各样的工作创造利润 +第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与 +如果成员参与了其中一项工作,就不能参与另一项工作 +工作的任何至少产生 minProfit 利润的子集称为 盈利计划 +并且工作的成员总数最多为 n +有多少种计划可以选择?因为答案很大,所以 返回结果模 10^9 + 7 的值。 +测试链接 : https://leetcode.cn/problems/profitable-schemes/ + +在一个小城市里,有 m 个房子排成一排 +你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n ) +有的房子去年夏天已经涂过颜色了,所以这些房子不可以被重新涂色 +我们将连续相同颜色尽可能多的房子称为一个街区 +比方说 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 +测试链接 : https://leetcode.cn/problems/paint-house-iii/ + + + + + + + + +