zoukankan      html  css  js  c++  java
  • [Swift]LeetCode1326. 灌溉花园的最少水龙头数目 | Minimum Number of Taps to Open to Water a Garden

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(let_us_code)
    ➤博主域名:https://www.zengqiang.org
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/12213419.html
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    There is a one-dimensional garden on the x-axis. The garden starts at the point 0 and ends at the point n. (i.e The length of the garden is n).

    There are n + 1 taps located at points [0, 1, ..., n] in the garden.

    Given an integer n and an integer array ranges of length n + 1 where ranges[i] (0-indexed) means the i-th tap can water the area [i - ranges[i], i + ranges[i]] if it was open.

    Return the minimum number of taps that should be open to water the whole garden, If the garden cannot be watered return -1.

    Example 1:


    Input: n = 5, ranges = [3,4,1,1,0,0]
    Output: 1
    Explanation: The tap at point 0 can cover the interval [-3,3]
    The tap at point 1 can cover the interval [-3,5]
    The tap at point 2 can cover the interval [1,3]
    The tap at point 3 can cover the interval [2,4]
    The tap at point 4 can cover the interval [4,4]
    The tap at point 5 can cover the interval [5,5]
    Opening Only the second tap will water the whole garden [0,5]
    Example 2:

    Input: n = 3, ranges = [0,0,0,0]
    Output: -1
    Explanation: Even if you activate all the four taps you cannot water the whole garden.
    Example 3:

    Input: n = 7, ranges = [1,2,1,0,2,1,0,1]
    Output: 3
    Example 4:

    Input: n = 8, ranges = [4,0,0,0,0,0,0,0,4]
    Output: 2
    Example 5:

    Input: n = 8, ranges = [4,0,0,0,4,0,0,0,4]
    Output: 1
     

    Constraints:

    1 <= n <= 10^4
    ranges.length == n + 1
    0 <= ranges[i] <= 100


    在 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:

     

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

    输入:n = 3, ranges = [0,0,0,0]
    输出:-1
    解释:即使打开所有水龙头,你也无法灌溉整个花园。
    示例 3:

    输入:n = 7, ranges = [1,2,1,0,2,1,0,1]
    输出:3
    示例 4:

    输入:n = 8, ranges = [4,0,0,0,0,0,0,0,4]
    输出:2
    示例 5:

    输入:n = 8, ranges = [4,0,0,0,4,0,0,0,4]
    输出:1
     

    提示:

    1 <= n <= 10^4
    ranges.length == n + 1
    0 <= ranges[i] <= 100


    Runtime: 148 ms
    Memory Usage: 21.7 MB
     1 class Solution {
     2     func minTaps(_ n: Int, _ ranges: [Int]) -> Int {
     3         var rg:[[Int]] = [[Int]](repeating: [Int](repeating: 0, count: 2), count: n + 1)
     4         for i in 0...n
     5         {
     6             let s:Int =  i - ranges[i]
     7             let e:Int =  i + ranges[i]
     8             rg[i] = [s < 0 ? 0 : s, e < n ? e : n]
     9         }
    10         rg = rg.sorted(by:{
    11             if $0[0] == $1[0]
    12             {
    13                 return $0[1] < $1[1]
    14             }
    15             else
    16             {
    17                 return $0[0] < $1[0]
    18             }
    19         }
    20         )
    21         var ans:Int = 0
    22         var i:Int = 0
    23         var start:Int = 0
    24         var end:Int = 0
    25         while(start < n && i <= n)
    26         {
    27             while(i <= n && rg[i][0] <= start)
    28             {
    29                 end = max(end, rg[i][1])
    30                 i += 1
    31             }
    32             if end <= start{return -1}
    33             start = end
    34             ans += 1
    35         }
    36         return ans
    37     }
    38 }
  • 相关阅读:
    Linux下vi和vim模式相互切换
    Linux文件系统目录
    华硕笔记本(UEFI)支持U盘启动
    什么是RSS feed?订阅RSS有什么好处?
    JSTL的时间格式化标签的使用
    token session区别 以及JWT无状态token
    c++ 重载成员函数的地址如何获取
    c++ __VA_ARGS__
    协程任务调度器
    yield return 1
  • 原文地址:https://www.cnblogs.com/strengthen/p/12213419.html
Copyright © 2011-2022 走看看