leetcode 第 406 场算法比赛

作者: | 更新日期:

找规律,拼手速的时候到了。

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

零、背景

这次比赛是找规律,大部分人都是 30分钟后内做完的吧。

A: 贪心。
B: 循环。
C: 贪心。
D: 贪心。

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

一、交换后字典序最小的字符串

题意:给一个数字字符串,问交换哪一对相邻数字,可以使得字典序最小。

思路:从前到后找到第一个可以交换的,交换后肯定最是最优答案。

可交换条件:奇偶性相同且前面的更大。

二、从链表中移除在数组中存在的节点

题意:给一个链表,删除值在集合里的节点。

思路:生成集合,循环判断与删除即可。

三、切蛋糕的最小总开销 I

题意:给一个矩阵,每次选择一个子矩阵,可以再选择一行或者一列进行切换,切割后矩阵会变成两个子矩阵。
告诉你每行和每列的切割代价,问怎么切割总的切割代价最小。

思路:找规律与贪心。

使用(2,2)(2,3)(3,2)矩阵模拟一下,可以证明,每次选择代价行与列中代价最大的那一个答案是最优的。

所以可以贪心,选切割最大的,再切割次大的。
直接递归模拟,可以发现每次矩阵个数增加1个,切割到 n*m 个小矩阵复杂度是 O(n*m)
所以,需要想办法合并切割方案。

这里继续观察子矩阵,看有什么规律。
假设最大的是行,次大的是列。

此时可以发现,最大的行把矩阵切割为两个子矩阵。
次大的列需要分别切割两个子矩阵,代价都是相同的。
由此,可以总结出之前行切割了多少次,当前这个列就需要切割多少次。

所以,需要维护之前行和列的切割次数。
这样,切割每一行和每一列时,只需要切割一次,就可以把所有子矩阵都切割了。
复杂度:O(n+m)

总结步骤如下:

1)行与列的代价排序。
2)维护行与列的切割次数。
3)从大到小访问待切割的行与列,计算当前切割总代价。

四、切蛋糕的最小总开销 II

同第三题。

五、最后

这次比赛前两题签到题,第三题和第四题一样,找到规律,贪心即可。

《完》

-EOF-

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

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

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

tiankonguse +
穿越