1326.灌溉花园的最少水龙头数目
链接:1326.灌溉花园的最少水龙头数目
难度:Hard
标签:贪心、数组、动态规划
简介:请你返回可以灌溉整个花园的 最少水龙头数目 。
题解 1 - cpp
- 编辑时间:2023-02-21
- 执行用时:16ms
- 内存消耗:14.3MB
- 编程语言:cpp
- 解法介绍:贪心,对每个起点找尽可能远的终点。
class Solution {
public:
int minTaps(int n, vector<int>& ranges) {
vector<int> list(n + 1, -1);
for (int i = 0; i < n + 1; i++) {
int start = max(i - ranges[i], 0), end = min(i + ranges[i], n);
list[start] = max(list[start], end);
}
int cnt = 0, prev = 0, last = 0;
for (int i = 0; i < n; i++) {
last = max(last, list[i]);
if (last == i) return -1;
if (i == prev) cnt++, prev = last;
}
return cnt;
}
};
题解 2 - rust
- 编辑时间:2023-02-21
- 执行用时:4ms
- 内存消耗:2.4MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
pub fn min_taps(n: i32, ranges: Vec<i32>) -> i32 {
let n = n as usize;
let mut l = vec![0; n + 1];
for i in 0..ranges.len() {
let start = 0.max(i as i32 - ranges[i]) as usize;
let end = (n as i32).min(i as i32 + ranges[i]) as usize;
l[start] = l[start].max(end);
}
let (mut res, mut pre, mut last) = (0, 0, 0);
for i in 0..n {
last = last.max(l[i]);
if last == i {
return -1;
}
if i == pre {
res += 1;
pre = last
}
}
res
}
}
题解 3 - python
- 编辑时间:2023-02-21
- 执行用时:84ms
- 内存消耗:15.3MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
def minTaps(self, n: int, ranges: List[int]) -> int:
l = [-1] * (n + 1)
for i in range(len(ranges)):
start = max(i - ranges[i], 0)
end = min(i + ranges[i], n)
l[start] = max(l[start], end)
cnt = prev = last = 0
for i in range(n):
last = max(last, l[i])
if last == i:
return -1
if i == prev:
prev = last
cnt += 1
return cnt