【问题标题】:Calculate walking points to reach target计算步行点以达到目标
【发布时间】:2022-10-07 14:02:18
【问题描述】:
  • 给定一个数字(完成终点),然后是一个 scooters 数组,其中 scooters 代表 ith scooter. 的位置

  • 在电池完全放电之前,每辆滑板车最多可以行驶 10 点,并且不能走得更远。例如,如果踏板车在点 5,它可以行驶到点 5、6、7、...、.,直到点 15(含),但不能到达点 16 或更远。

  • 计算到达目标的步行步数。

示例 1:

finish=23, scooters[7, 4, 14] 
output -> solution(finish, scooters) = 4

说明1:

  • 从 0 开始,最近的滑板车是 scooters[1] = 4,所以走到那里需要 4 个点。
  • 然后滑板车最多可以上10分,10+4=14。
  • 在 14 个点有一辆滑板车(滑板车 [2] = 14)。
  • 这样我们就可以直奔终点完成23了。
  • 所以一共是4个步行点

示例 2:

finish=27, scooters[15, 7, 3, 10]
output -> solution(finish, scooters) = 5

我的代码:

finish=23
scooters = [7, 4, 14]

def solution(finish, scooters):
    sum = min(scooters)
    step = min(scooters)
    
    while sum < finish:
        step += 10
        sum = sum + step
    
    return step

solution(finish, scooters)

如何在 while 循环中包含 scooters[i] 以检查下一个可用的滑板车?


    标签: python python-3.x algorithm data-structures


    【解决方案1】:

    在没有太多逻辑的情况下实现一致性的最简单方法是首先sort()ing 你的列表。之后,您可以计算两辆超过 10 步的滑板车之间的任何距离,并将其添加到总和中:

    def solution(finish, scooters):
        scooters.append(finish)
        scooters.sort()
        steps = scooters[0]
        for i in range(1, len(scooters)):
            if finish in (scooters[i], scooters[i - 1]):
                break
            steps += max(0, scooters[i] - scooters[i - 1] - 10)
    
        return steps
    
    print(solution(27, [15, 7, 3, 10]))
    # 5
    print(solution(23, [7, 4, 14]))
    # 4
    print(solution(10, [15, 7, 3, 10]))
    # 3
    print(solution(2, [15, 3]))
    # 2
    

    【讨论】:

    • 针对各种输入测试您的算法。这并不完全正确。
    • 能给我举个例子吗?
    • 我在原始逻辑中发现了一些错误,即如果完成位于踏板车之前并且剩余的踏板车之间有台阶。我修改了示例以将这些考虑在内并提供了示例。
    • @LTJ 我们是否应该在声明 if finish in (scooters[i], scooters[i - 1]): 之后移动 steps += max(0, scooters[i] - scooters[i - 1] - 10) 这将解决 scooter[0] = finish. 的边缘情况
    • 这确实有道理,我将编辑答案。接得好
    【解决方案2】:

    作为一种简单的方法,您可以迭代 scooters 数组,并根据 i-th scooter 和 i+1-th scooter 之间的距离增加步数。

    def solution(finish, scooters):
        i = 0
        n = len(scooters)
        scooters.sort()
        steps = min(scooters[0], finish)
        for i in range(0, n-1):
            if scooters[i] + 10 >= finish:
                break
            elif scooters[i+1] > finish:
                steps += max(0, finish-scooters[i]-10)
            else:
                steps += max(0, scooters[i+1]-scooters[i]-10)
        if scooters[-1] < finish:
            steps += max(0, finish - scooters[-1] - 10)
        return steps
    
    print(solution(27, [15, 7, 3, 10]))
    print(solution(23, [7,4,14]))
    

    时间复杂度:O(nlogn) 其中nscooters 数组的长度。

    【讨论】:

      【解决方案3】:

      解决这个问题的一种方法是计算踏板车不能走的步数。您可以通过创建需要执行的所有步骤的列表并用 1 填充它来做到这一点。然后将踏板车可以采取的任何步骤设置为 0。步行步数就是列表的总和:

      def solution(finish, scooters):
          steps = [1 for _ in range(finish+1)]
          zeros = [0 for _ in range(11)]
          for s in scooters:
              steps[s:s+11] = zeros
          return sum(steps)
      
      solution(27, [15, 7, 3, 10])
      # 5
      solution(23, [7,4,14])
      # 4
      

      【讨论】:

      • 对于 finish 的大值是不可行的,这对于竞争性编程问题是典型的
      • @AbhinavMathur 大多数计算机都有足够的内存来存储相当大的整数列表......
      • 虽然这可能是真的,但像 LeetCode 这样的练习平台上的大多数算法问题都有指定的时间限制。
      • @AbhinavMathur 因为排序是O(nlogn),这是O(31n)(假设踏板车的数量大约是finish 值的1/10),实际上这个解决方案在某个点上变得更快。在我的旧笔记本电脑上,大约是 10,000,000 大关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多