leetcode 第 403 场算法比赛

作者: | 更新日期:

第三题比第四题难。

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

零、背景

个人感觉这次比赛第三题更难,但没想到第三题过了这么多人。

A: 排序遍历。
B: 略。
C: 动态规划。
D: 枚举。

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

一、最小元素和最大元素的最小平均值

题意:给一个数组,每次选择一个最大值和最小值,问最后数组为空时,选择的元素对的最小平均值。

思路:排序,依次选择,保留最小和,最后除于二。

二、包含所有 1 的最小矩形面积 I

题意:给一个二维数组,求一个边与坐标轴垂直的最小矩阵的面积,使得这个矩阵恰好覆盖所有值为1的元素。

思路:上下左右求边界,然后公式计算出面积。

三、最大化子数组的总成本

题意:给一个数组,问怎么拆分子数组,才能使得所有子数组成本之和最大。
子数组成本:加上奇数位置元素,减去偶数位置元素。

思路:动态规划。

定义 F(a,b) 子数组 [a,b]的成本。
状态: f(a,b) 将子数组拆分之后的最大成本。

默认思路为暴力枚举,转移方程如下
f(0,n) = max(F(0,i) + f(i+1,n))
复杂度:O(n^2)

把数组画出来,分析每个位置的符号,可以发现某些子数组的符号是不变的,部分子数组的符号是翻转的。
故根据一个位置符号是否翻转,可以写出下面的状态和转移方程。

状态:f(n, sign) 第 n 个元素符号为 sign 时,后缀的最优答案。
方程:

f(n, +) = V[n] + max(f(n+1, +), f(n+1, -))
f(n, -) = -V[n] + f(n+1, +)

方程解释:
如果一个位置符号为正,则下个位置可以是新的子数字起始位置,也可以是当前的后缀,取最大值。
如果一个位置符号为负,则下个位置的符号必然为正。

复杂度:O(n)

四、包含所有 1 的最小矩形面积 II

题意:给一个 01 数组,问是否可以用三个不重叠的矩阵,覆盖所有值为1的位置。

思路:数据范围只有 30, 显然是要枚举的。

简单画图,可以发现只存在 6 种情况。

针对这 6 种情况,一种是一个个枚举,一个是 DFS 递归枚举。

我分析之后,发现如果旋转矩阵,则只有两种情况:两个行 或者 一个横一个竖。

所以我是通过旋转矩阵,然后枚举两种情况计算答案的。

五、最后

这次比赛最后一题是模拟题,而第三题则有点难度,不敢相信,竟然通过了 1266 人。

这次比赛第三题你是怎么想的,通过了吗?

《完》

-EOF-

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

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

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

tiankonguse +
穿越