leetcode 第 212 场算法比赛

作者: | 更新日期:

这次比赛的题有点意思

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

零、背景

这次比赛的题有点意思,我读错题了,浪费不少时间。

一、按键持续时间最长的键

题意:给一个字符串列表,以及每个字符的按键松开的时间。
问哪个字符按键时间最长。

思路:每个按键事件是独立的,循环计算出最长时间即可。
我读错题了,计算的是每个字母的总按键时长。

二、等差子数组

题意:给一个数组,有若干子区间询问。
问子区间排序后是否是等差数列。

思路:按照题意对子区间排序,判断是不是等差数组即可。

三、最小体力消耗路径

题目:给一个二维矩阵,求从左上角跳到右下角的最小代价。

规则:只能上下左右跳。
代价:跳一次代价是两个位置的差值。

思路:BFS 搜索即可。

由于求最优值,需要使用最小堆维护队列。

四、矩阵转换后的秩

题意:给一个矩阵,求矩阵的秩 rank

秩的定义:

1)如果一个元素 v 是所在行所在列的最小值,秩为 rank(v)=1
2)同一行或者同一列两个元素应该与两个秩保持相同的大小关系。
3)秩越小越好。

例如,假设两个元素分别是 q 和 p。

1) q == p 时,rank(q) == rank(p)
2) q < p 时,rank(q) < rank(p)
3) q > p 时,rank(q) > rank(p)

思路:与上一题类似, BFS 搜索即可。

注意事项:遇到相等的值时,需要再次 DFS 或者 BFS 搜索,找到同行或同列所有相等元素的最大秩,这些相等的元素都应该等于这个最大秩。

那该如何找到所有相等元素呢?
预处理每一行与每一列,将相等的元素使用数据结构连起来。

一种简单的数据结构是map<value, vector<index>>
我选择的是十字链表。

赛后,突然发现储存一个图会更简单,即每个坐标四个方向第一个相等的坐标。
数据结构如下:

struct Edge{
    vector<pair<int,int>> e;
};

五、最后

这次比赛整体难度不大。

最后一题我一开始使用的队列,遇到相等的需要预处理,就想复杂了。
预处理的时候想直接计算出答案,就自己裸写最小生成树+BFS算法,结果时间不够了。
后来预处理只做相同值的关系,几分钟就过了。

看来做题还是要多想,不要直接就敲代码,思路可能没错,可能会想复杂导致算法比较复杂。

思考题:你怎么做的最后一题?

《完》

-EOF-

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

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

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

tiankonguse +
穿越