我正在做一些编程练习。这个已经非常有名,并在不同的地方回答。
FrogRiverOne 找到青蛙可以跳到河的另一边的最早时间。 https://codility.com/programmers/task/frog_river_one/
我的问题是,如果青蛙可以跳到D的距离怎么办?我们怎样才能找到最短的过河时间,具有最佳的运行时间复杂度?谢谢!
int solution(int X, vector<int> &A, int D); // frog can jumps from 1 to D steps
答案 0 :(得分:1)
我认为shole贪婪的解决方案几乎是正确的。如果在更改Current_Pos
时包含递归传播步骤,则将确保青蛙始终位于最前面的位置。
这是一种避免递归的替代方法:
如果有叶子,请使用存储每个位置的占用数组。并为每个位置使用带有节点的union-find数据结构。联合查找数据结构将跟踪可以彼此到达的节点(即连接的组件)。然后,任务是找到两个河岸相连的第一个时间点。
要找到这个,请执行以下操作:每次启动新叶子时,将其位置标记为已占用。然后,将union-find数据结构中的节点与从该位置(-D
到+D
)可到达的每个其他占用节点联合起来。最后,检查两个河岸是否都已连接。总体时间复杂度为O(ND+X)
。
两种解决方案中的哪一种更快取决于输入。
答案 1 :(得分:0)
使用Linq在c#上尝试一下:
private static int FrogRiverOne(int X,int[] A)
{
if (Enumerable.Range(1,X).Except(A).Any()) { return -1; }
var orderBy = A.Select((y, z) => new { y, z }).GroupBy(a => a.y).Select(a =>
{ var ff = a.Min(xe => xe.z); return new { a,ff }; });
var second = orderBy.Max(xe => xe.ff);
return second;
}