我一直在努力解决这个问题好几天了,没有取得任何进展:
https://www.hackerrank.com/challenges/points-in-a-plane
我尝试了一个贪婪的详尽解决方案,在每对点之间画一条线,然后根据它们交叉的点数开始按降序消除这些线。不幸的是,至少在一种情况下,这种方法会产生次优结果:
为了便于讨论,我将根据它们包含的点数将它们称为“更长”或“更短”。贪心算法只是按照长度递减的顺序消除线条。
假设我们有一组 N 个较长的行,以及另一组 M 个较短的行。我们的贪心算法将首先消除长线。但是,如果长线的每一个点都包含在短线中呢?在这种情况下,我们最初消除 N 条较长的行是一种浪费,因为如果我们只是消除了较短的行,我们就会“免费”获得这些行。具体来说,我们的贪心方法将需要 N + M 次消除,我们可以在 M 步内清除所有点。
演示这一点的最简单示例输入是:
(0, 1), (1, 2), (2, 4), (3, 3)
(0, 0), (1, 0), (2, 0), (3, 0)
(0,-1), (1,-2), (2,-4), (3,-3)
如您所见,我们有一条长度为 4 的线沿 X 轴延伸,还有 4 条长度为 3 的较短线垂直于它。我们的贪心算法会先剔除最长的线,之后会剩下8组点,共线的不超过2组。因此,消除这些将需要 4 个步骤,总共 5 个。如果我们只是从较短的垂直线开始,我们可以分 4 个步骤消除所有点。
有人可以至少提供解决此问题所需的一般知识体系的提示吗?我解决了许多其他 HackerRank 问题,但在这个问题上没有取得任何进展。