灌溉花园的最少水龙头数目(动态规划,贪心算法)
在 x 轴上有一个一维的花园。花园长度为 n,从点 0 开始,到点 n 结束。
花园里总共有 n + 1 个水龙头,分别位于 [0, 1, …, n] 。
给你一个整数 n 和一个长度为 n + 1 的整数数组 ranges ,其中 ranges[i] (下标从 0 开始)表示:如果打开点 i 处的水龙头,可以灌溉的区域为 [i - ranges[i], i + ranges[i]] 。
请你返回可以灌溉整个花园的 最少水龙头数目 。如果花园始终存在无法灌溉到的地方,请你返回 -1 。
(1)贪心算法解题思路:
- pre[i]表示以i为最右端点时能覆盖最大范围;
- furthest表示当前端点灌溉的最小左端点(x轴坐标最小);
- ans表示可以灌溉整个花园的最少水龙头数。
- 当i = n时,记录furthest = pre[i]的值表示当前情况下,能覆盖的范围,即目前的最优解,然后一直向左遍历更新furthest = min(furthest, pre[i]),当遍历到 i = pre[n], 如果在遍历过程中有furthest 比i小,则说明有一个区间覆盖了i,所有i不属于所有区间覆盖不了的点,ans++。
- 但如果furthest >= i,表明i是一个独立的端点,没有区间,即 (i-1,i)这个区间无法覆盖,所以返回-1;
/**
* @author chengqian
* @create 2020-07-07 20:59
* Tag-贪心算法 , LeetCode-1326-困难
*/
public static int minTaps(int n, int[] ranges){
int[] pre = new int[n+1];
Arrays.fill(pre, Integer.MAX_VALUE);
//因为数组初始化默认为0,不给赋值一个较大值,pre[right]就会恒等于0;
for (int i = 0