LeetCode 第430场周赛
As my job requires it, I am studing English now. Therefore, I will write the solutions to these problems in English.


虽然排名最后跌到 86 了,但还是复健比较成功的一场。
3 分 - 使每一列严格递增的最少操作次数
如果 grid[i][j] 比 grid[i-1][j] 小,就要变成 grid[i-1][j]+1 才能满足严格递增。
从上到下遍历,同时记录变更的 diff 就行。
1 | class Solution { |
4 分 - 从盒子中找出字典序最大的字符串
将字符串分成 numFriends ,子串最长为 word.length() - numFriends +1、最短为 1。
如果前缀相同,长的字符串字典序大,所以尽可能让子串最长。
考虑到 word 长度只有 1000,不用上 Suffix Array 啥的,直接暴力 处理既可。
遍历 word ,截取每个位置开头长度最长为 word.length() - numFriends +1 的子串,排序后取最大的。
注意 numFriends == 的情况,直接返回 word 既可。
1 | class Solution { |
5 分 - 统计特殊子序列的数目
nums[p] * nums[r] == nums[q] * nums[s] 可以变形为 nums[p] / nums[q] == nums[s] / nums[r]
这样可以把等号两边的数字分在左右两边。枚举 q 时,p 在 q 的前面, s 和r 在 q 的后面。
我们预处理下所有 nums[s] / nums[r] 的个数用个 map 存下来既可,枚举 q 时把落在 q+1 范围内的值删掉,然后计算贡献既可。
⚠️: nums[s] / nums[r] 可能无法整除,我们把这两个数字约分后错位加在一起就行: nums[s]/x*1000 + nums[r]/x
1 | using LL = long long; |
6 分 - 统计恰好有 K 个相等相邻元素的数组数目
考虑 k==0,则长为 n 的数组,值域为 [1, m] 的方案数是 $ m * (m-1) ^ {n-1}$.
考虑 k:
k=1, 如果i这个位置是arr[i - 1] == arr[i]的- 那么
arr[i - 2] != arr[i - 1],arr[i] != arr[i+1]。
- 那么
k=2, 如果i和i+1这两个位置是arr[i - 1] == arr[i]的- 那么
arr[i - 2] != arr[i - 1],arr[i] == arr[i+1],arr[i+1] != arr[i+2]。
- 那么
容易看出k=x时,相当于是在构造长度为 n-x 的数组,k=0 时值域为 [1, m] 的数组,方案数是 $ m * (m-1) ^ {n-x-1}$.
k 只能放到 [2, n] 上,所以 k 的位置组合就是 C(n-1, k).
最终答案就是 $ C(n-1, k) \times m \times m^{n-k-1}$
1 | using LL = long long; |