leetcode 第 410 场算法比赛

作者: | 更新日期:

这次比赛比较简单,前缀和。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

这次比赛依旧没参加,四道题都不难。

A: 模拟。
B: DFS。
C: 动态规划+前缀和优化。
D: 动态规划+前缀和优化。

排名:无
代码地址: https://github.com/tiankonguse/leetcode-solutions/tree/master/contest/4/410

一、矩阵中的蛇

题意:给一个矩阵、起始位置、移动指令,问最终的位置。

思路:按题意模拟即可。

二、统计好节点的数目

题意:给一个树,问有多少个子树是好节点。
好节点:所有子节点为根的子树的节点个数相等时,为好节点。

思路:递归。

递归算每个子树是不是好节点。
计算的时候,顺便储存下每个子树的节点个数,从而可是计算父节点是否是父节点。

复杂度:O(n)

三、单调数组对的数目 I

题意:给一个数组,求构造两个数组,一个是非递减的,一个是非递增的,两个数组相同位置的元素和等于输入数组对应位置的元素值。
问共有多少种构造方法。

思路:动态规划。

状态定义:f(i,v)
含义:第一个数组第i个位置值为v时,前i个位置的答案个数。

状态转移方程:f(i,v)=sum(i-1, V), V<=v
含义:第i个位置值为v时,前一个位置的值只能是 [0,v],这样才能保证非递减。

对于输入元素,假设前一个元素值是 V0, 则两数组可能得值如下:

第一个数组: 0  1 2 ... V0 
第二个数组: V0 ... 2 1 0

假设第二个元素值是 V1, 如果第一个数组选择 0,则第二个数组值为 V1。
V1 是否满足第二个数组的性质依赖于与 V0 的大小关系。

如果 V1 小于等于 V0, 则第二个数组满足非递增性质。
此时第一个数组取值范围可以是 [0,V1], 第二个数组都存在合法值。
第一个数组值为 v 时,答案个数为 sum[i-1][0,v]

如果 V1 大于 V0,则第一个数组取值 0 时,第二个数组不存在合法值。
第二个数组能接受的最大值是 V0, 此时第一个数组需要取值 V1-V0
之后的取值都存在和法治,故第一个数组取值范围为[V1-V0,V1]
第一个数组为 v 时,答案个数为 sum[i-1][0,v-(V1-V0)]

对于 sum[i-1][0,v] 可以通过计算前缀和来快速计算出答案。

四、单调数组对的数目 II

题意:同第三题

五、最后

这次比赛比较简单,拼手速的时候到了。

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越