有一个长度为N的一维花园。在N长花园的每个位置,都安装了一个喷泉。给定一个数组a [] ,使a [i]描述第i个喷泉的覆盖范围限制。喷泉可以覆盖从位置max(i – a [i],1)到min(i + a [i],N)的范围。开始时,所有喷泉均关闭。任务是找到需要激活的喷泉的最少数量,以使整个N长度的花园都可以被水覆盖。
例子:
Input: a[] = {1, 2, 1}
Output: 1
Explanation:
For position 1: a[1] = 1, range = 1 to 2
For position 2: a[2] = 2, range = 1 to 3
For position 3: a[3] = 1, range = 2 to 3
Therefore, the fountain at position a[2] covers the whole garden.
Therefore, the required output is 1.
Input: a[] = {2, 1, 1, 2, 1}
Output: 2
方法:可以使用动态编程解决问题。请按照以下步骤解决问题:
- 遍历数组,并为每个数组索引(即第i个喷泉)找到当前喷泉覆盖的最左边的喷泉。
- 然后,找到在上述步骤中获得的最左边的喷泉所覆盖的最右边的喷泉,并在dp []数组中对其进行更新。
- 初始化变量cntFount来存储需要激活的喷泉的最小数量。
- 现在,遍历dp []数组,并从左侧继续激活喷泉,该喷泉覆盖当前右侧的最大喷泉,并将cntFount增加1 。最后,将cntFount打印为所需答案。
下面是上述方法的实现。
C++14
Java
Python3
C#
输出
时间复杂度: O(N)
辅助空间: O(N)