无法理解解决方案背后的逻辑[FrogRiverOne]

时间:2018-05-13 18:31:27

标签: python algorithm

我无法理解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个元素背后的逻辑是什么

2 个答案:

答案 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;
  }
}

您可以找到此问题的代码和单元测试here以及完整的Codility解决方案列表,其中包含对策略的解释here