当前位置: 首页 > news >正文

2023-2-23 刷题情况

灌溉花园的最少水龙头数目

题目描述

在 x 轴上有一个一维的花园。花园长度为 n,从点 0 开始,到点 n 结束。

花园里总共有 n + 1 个水龙头,分别位于 [0, 1, …, n] 。

给你一个整数 n 和一个长度为 n + 1 的整数数组 ranges ,其中 ranges[i] (下标从 0 开始)表示:如果打开点 i 处的水龙头,可以灌溉的区域为 [i - ranges[i], i + ranges[i]] 。

请你返回可以灌溉整个花园的 最少水龙头数目 。如果花园始终存在无法灌溉到的地方,请你返回 -1 。

样例

样例输入

n = 5, ranges = [3,4,1,1,0,0]
n = 3, ranges = [0,0,0,0]

样例输出

1
解释:
点 0 处的水龙头可以灌溉区间 [-3,3]
点 1 处的水龙头可以灌溉区间 [-3,5]
点 2 处的水龙头可以灌溉区间 [1,3]
点 3 处的水龙头可以灌溉区间 [2,4]
点 4 处的水龙头可以灌溉区间 [4,4]
点 5 处的水龙头可以灌溉区间 [5,5]
只需要打开点 1 处的水龙头即可灌溉整个花园 [0,5] 。

-1
解释:即使打开所有水龙头,你也无法灌溉整个花园。

提示

  • 1<=n<=1041 <= n <= 10^41<=n<=104
  • ranges.length==n+1ranges.length == n + 1ranges.length==n+1
  • 0<=ranges[i]<=100 <= ranges[i] <= 100<=ranges[i]<=10

思路

大的总问题可以化为相同类型的子问题,可以使用动态规划。且不仅仅可以使用动态规划,还可以使用贪心思想,因为在相同类型的子问题中,可以取其最优解。

代码实现

动态规划

class Solution {public int minTaps(int n, int[] ranges) {int[][] arr = new int[n+1][2];for(int i = 0; i <= n; i++){arr[i][0] =  Math.max(0, i - ranges[i]);arr[i][1] = Math.min(n, i + ranges[i]);}Arrays.sort(arr, (a, b) -> a[0] - b[0]);int[] dp = new int[n+1];Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;for(int[] a : arr){if(dp[a[0]] == Integer.MAX_VALUE) return -1;for(int i = a[0]; i <= a[1]; i++) dp[i] = Math.min(dp[i], dp[a[0]] + 1);}return dp[n];}
}

贪心思想

class Solution {public int minTaps(int n, int[] ranges) {int[] right = new int[n+1];for(int i = 0; i <= n; i++) right[i] = i;for(int i = 0; i < ranges.length; i++){int start = Math.max(0, i - ranges[i]);int end = Math.min(n, i + ranges[i]);right[start] = Math.max(right[start], end);}int last = 0, res = 0, pre = 0;for(int i = 0; i < n; i++){last = Math.max(last, right[i]);if(i == last) return -1;if(i == pre){res++;pre = last;}}return res;}
}
http://www.lryc.cn/news/17790.html

相关文章:

  • 数据归档,存储的完美储备军
  • ES6-11、基本全部语法
  • Spring Boot整合Thymeleaf和FreeMarker模板
  • SQL的四种连接-左外连接、右外连接、内连接、全连接
  • “点工”的觉悟,5年时间从7K到24K的转变,我的测试道路历程~
  • 【Web安全-MSF记录篇章一】
  • 配置Flutter开发环境
  • 23年六级缓考
  • 低代码选型,论协同开发的重要性
  • 【第二十二部分】游标
  • 【面试题】2023高频前端面试题20题
  • Spring解决循环依赖为什么需要三级缓存?
  • Android源码分析 - 回顾Activity启动流程
  • PDMS二次开发(一)——PML类型程序类型与概念
  • 一文揭晓:手机号码归属地api的作用是什么?
  • 电容的结构分类介质封装及应用场景总结
  • 数据结构初阶——时间复杂度与空间复杂度
  • 深度学习之“制作自定义数据”--torch.utils.data.DataLoader重写构造方法。
  • #G. 求约数个数之六
  • 如何为Java文件代码签名及添加时间戳?
  • Xamarin.Forsm for Android 显示 PDF
  • RK3399平台开发系列讲解(LED子系统篇)LED子系统详解
  • LeetCode 432. 全 O(1) 的数据结构
  • 再析jvm
  • 社招前端二面面试题总结
  • 人人能读懂redux原理剖析
  • uniCloud云开发----7、uniapp通过uni-swiper-dot实现轮播图
  • IM即时通讯构建企业协同生态链
  • Python实现构建gan模型, 输入一个矩阵和两个参数值,输出一个矩阵
  • 开学准备哪些电容笔?ipad触控笔推荐平价