我正在解决Codility中的以下问题:
一只小青蛙想去河的另一边。青蛙当前位于位置0,并且想要到达位置X。树叶从树上掉到河面上。给您一个非空的零索引数组A,该数组A由代表落叶的N个整数组成。 A [K]表示在时间K处一片叶子掉落的位置,以分钟为单位。目的是找到青蛙跳到河对岸的最早时间。只有当叶子从1到X穿过河的每个位置时,青蛙才能穿过。
我使用以下解决方案,但仅获得81分:
代码在C#中。
using System;
using System.Collections.Generic;
class Solution {
public int solution(int X, int[] A) {
bool[] tiles = new bool[X];
for (int i = 0; i < A.Length; i++)
{
tiles[A[i] - 1] = true;
bool complete = true;
for (int j = 0; j < tiles.Length; j++)
{
if (!tiles[j])
{
complete = false;
break;
}
}
if (complete)
return i;
}
return -1;
}
}
我的算法在O(NX)运行。什么是仅需要O(N)的更好算法?
将您的代码更改为类似这样的内容:
public int solution(int X, int[] A)
{
bool[] tiles = new bool[X];
int todo = X;
for (int i = 0; i < A.Length; i++)
{
int internalIndex = A[i] - 1;
if (internalIndex < X && !tiles[internalIndex])
{
todo--;
tiles[internalIndex] = true;
}
if (todo == 0)
return i;
}
return -1;
}
此算法只需要O(A.length)
时间,因为它始终跟踪我们仍然需要用树叶填充多少“洞”。
这里如何完成?
todo
是建立叶子“桥”所需的叶子数。每当叶子掉落时,我们首先检查叶子掉落的位置是否还没有叶子。如果不是,我们递减todo
,填充孔并继续。todo
到达0
后,整个河流就会被覆盖;)
100%得分:FrogRiverOne的PHP代码:Ajeet Singh
C90
,我看到了很多语言。像许多人一样,我确实通过创建辅助阵列找到了解决方案。我先使用典型的calloc
,然后再使用free
。我的第一个解决方案与其他发布的类似: