leetcode 第 391 场算法比赛

作者: | 更新日期:

手速有点慢,依旧是100多名。

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

零、背景

今天比赛最后一题是模版题,知道了就很简单。

A: 简单计算。
B: 简单模拟。
C: 数学公式。
D: 最大曼哈顿距离模版。

排名:160
代码地址: https://github.com/tiankonguse/leetcode-solutions/tree/master/contest/3/391

一、哈沙德数

题意:问一个数字是否可以整除各位数字之和。

思路:先计算各位之和,然后判断是否可以整除。

int v = 0;
while(n) {
    v += n%10;
    n /= 10;
}

二、换水问题 II

题意:原先有 n 瓶水, K 个瓶子可以换一瓶水,之后 K 需要加一。问最终可以喝多少瓶水。

思路:按题意每次喝 K 瓶水再加一瓶水去模拟即可。

while( n>= k){
    ans += k;
    n = n - k + 1;
    k++;
}
ans += n;

三、交替子数组计数

题意:给一个二进制数组,问有多少个子数组是 01 交替出现的。

思路:数组分为几个最长的 01 交替子数组分组,这些分组的所有子数组都满足答案。

长度为 n 的分组,子数组个数为 C(n+1, 2)个。

四、最小化曼哈顿距离

题意:给 N 个坐标,问删除一个点后得到的所有最大曼哈顿距离离的最小值。

思路:先看如何求 n 个点的最大曼哈顿距离,然后再看如何把删除操作加进入。

假设有两点 (x0,y0)(x1,y1)
曼哈顿距离为 abs(x0-x1)+abs(y0-y1)

如果把绝对值展开,则分为四种情况,蔓哈顿距离为四种情况的最大值。

+(x0-x1) + (y0-y1)
+(x0-x1) - (y0-y1)
-(x0-x1) - (y0-y1)
-(x0-x1) - (y0-y1)

分为两个坐标的关系,即如下

(x0+y0) - (x1+y1)
(x0-y0) - (x1-y1)
(-x0-y0) - (-x1-y1)
(-x0+y0) - (-x0+y1)

可以发现,四种情况两个坐标中 X 与 Y 的符号是相同的。

n 个坐标时,有 4N 个这样的公式,根据符号可以分为四组。
每一组的最大值显然是组内的最大值减去组内的最小值。

故可以对组内公式的值排序,从而得到每组内的最大值。
四组内的最大值中的最大值就是 n 个坐标的最大曼哈顿距离。

复杂度:n log(n)

模板可以参考这里: https://github.com/tiankonguse/leetcode-solutions/blob/master/doc/geometry/max_manhattan.cpp

现在题意要求删除一个元素,如何处理呢?

枚举删除的元素,每组内求最大值与最小值时,忽略删除的元素即可。

具体来说,看最大值是不是删除的元素,是了就用次大值代替最大值。
最小值也是相同的逻辑。

代码: https://github.com/tiankonguse/leetcode-solutions/blob/master/contest/3/391/D.cpp

五、最后

这次比赛最后一题是模板题,属于知道这个就可以通过,不知道就很难通过,没啥技术含量。

思考题:如何求最小曼哈顿距离呢?

《完》

-EOF-

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

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

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

tiankonguse +
穿越