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; |