-
Notifications
You must be signed in to change notification settings - Fork 0
/
maximum_fruits_harvested_after_at_most_k_steps.rs
52 lines (48 loc) · 2.02 KB
/
maximum_fruits_harvested_after_at_most_k_steps.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// 摘水果
// https://leetcode.cn/problems/maximum-fruits-harvested-after-at-most-k-steps
// INLINE ../../images/array/maximum_fruits_harvested_after_at_most_k_steps.jpeg
pub struct Solution;
impl Solution {
pub fn max_total_fruits(fruits: Vec<Vec<i32>>, start_pos: i32, k: i32) -> i32 {
// 初始化左右指针和水果列表长度
let mut left = 0;
let mut right = 0;
let n = fruits.len();
// 初始化摘到的水果总数和最大值
let mut sum = 0;
let mut ans = 0;
// 定义计算两个水果之间距离的闭包函数
let step = |left: usize, right: usize| -> i32 {
// 如果右侧水果在起始位置左边,则返回左侧水果位置到起始位置的距离
if fruits[right][0] <= start_pos {
start_pos - fruits[left][0]
// 如果左侧水果在起始位置右边,则返回右侧水果位置到起始位置的距离
} else if fruits[left][0] >= start_pos {
fruits[right][0] - start_pos
// 否则返回左右两侧水果到起始位置的距离之和再加上左右两侧水果的距离
} else {
std::cmp::min(
(start_pos - fruits[right][0]).abs(),
(start_pos - fruits[left][0]).abs(),
) + fruits[right][0]
- fruits[left][0]
}
};
// 右指针遍历整个水果列表
while right < n {
// 累加摘到的水果数量
sum += fruits[right][1];
// 如果左右两侧水果之间距离超过了k,左指针向右移动并减去左侧水果的数量,直到距离小于等于k
while left <= right && step(left, right) > k {
sum -= fruits[left][1];
left += 1;
}
// 更新最大值
ans = std::cmp::max(ans, sum);
// 右指针向右移动
right += 1;
}
// 返回最大值
ans
}
}