我无法理解Codility FrogRiverOne解决方案背后的逻辑https://codility.com/demo/take-sample-test/frog_river_one
任务说明
一只小青蛙想要到达河的另一边。青蛙最初位于河的一岸(位置0)并且想要到达对岸(位置X + 1)。树叶从树上落到河面上。
给出一个数组A,由表示落叶的N个整数组成。 A [K]表示一片叶子在时间K下降的位置,以秒为单位测量。
目标是找到青蛙可以跳到河的另一边的最早时间。只有当叶子出现在从1到X的河对岸的每个位置时,青蛙才能穿过(也就是说,我们希望找到从1到X的所有位置被叶子覆盖的最早时刻)。您可以假设河流中的电流速度可以忽略不计,即一旦落入河中,叶子就不会改变它们的位置。
例如,给定整数X = 5和数组A,使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
在第二个6中,叶子落入位置5.这是叶子出现在河对岸的每个位置的最早时间。
写一个函数:
def解决方案(X,A)
给定一个由N个整数和整数X组成的非空数组A,返回青蛙可以跳到河的另一边的最早时间。
如果青蛙永远不能跳到河的另一边,那么该函数应该返回-1。
例如,给定X = 5和数组A,使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
该函数应返回6,如上所述。
假设:
N和X是范围内的整数[1。 100000] 数组A的每个元素是范围内的整数(1.X)。 复杂度:
预期的最坏情况时间复杂度为O(N); 预期的最坏情况空间复杂度是O(X)(不计算输入参数所需的存储空间)。
解决方案 -
Input arguments to Function - (2,[2,2,2,2,2]) and (5, [1, 3, 1, 4, 2, 3, 5, 4])
def solution(X,A):
covered = 0
covered_a = [-1]*X
for index,element in enumerate(A):
if covered_a[element-1] == -1:
covered_a[element-1] = element
covered += 1
if covered == X:
return index
return -1
我想了解创建一个布尔数组并从输入数组A中明智地减去1个元素背后的逻辑是什么
答案 0 :(得分:1)
这是因为您要标记到目前为止已看到的所有数字。因此,所有这些都以“ False”开头,因为您还没有看到它们。
答案 1 :(得分:0)
我将为您提供我的Java解决方案,以获得100%得分的问题。主要策略是使用java.util.Set
存储完整跳转所需的所有整数,使用第二个java.util.Set
来保存当前叶子,并继续检查第一组是否完全存在于第二组中。
package com.codility.lesson04.countingelements;
import java.util.HashSet;
import java.util.Set;
public class FrogRiverOne {
public int solution(int X, int[] A) {
SetrequiredLeavesSet = new HashSet();
for(int i=1; i<=X; i++) {
requiredLeavesSet.add(i);
}
SetcurrentLeavesSet = new HashSet();
for(int p=0; p<A.length; p++) {
currentLeavesSet.add(A[p]);
//keep adding to current leaves set until it is at least the same size as required leaves set
if(currentLeavesSet.size() < requiredLeavesSet.size()) continue;
if(currentLeavesSet.containsAll(requiredLeavesSet)) {
return p;
}
}
return -1;
}
}