Skip to content

Commit f40ee25

Browse files
authored
Create 摘水果.py
1 parent 214d6f4 commit f40ee25

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

2106. 摘水果/摘水果.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# 由于只能一步步地走,人移动的范围必然是一段连续的区间。
2+
3+
# 如果反复左右移动,会白白浪费移动次数,所以最优方案要么先向右再向左,要么先向左再向右(或者向一个方向走到底)。
4+
5+
# 设向左走最远可以到达 fruits[left][0]\textit{fruits}[\textit{left}][0]fruits[left][0],这可以用枚举或者二分查找得出,其中 left\textit{left}left 是最小的满足
6+
7+
# fruits[left][0]≥startPos−k
8+
# 的下标。
9+
10+
# 假设位置不超过 startPos 的最近水果在 fruits[right][0],那么当 right 增加时,left 不可能减少,有单调性,因此可以用同向双指针(滑动窗口)解决。不了解的同学可以先看上面的视频讲解。
11+
12+
# 如何判断 left 是否需要增加呢?
13+
14+
# 如果先向右再向左,那么移动距离为
15+
16+
# (fruits[right][0]−startPos)+(fruits[right][0]−fruits[left][0])
17+
# 如果先向左再向右,那么移动距离为
18+
19+
# (startPos−fruits[left][0])+(fruits[right][0]−fruits[left][0])
20+
# 如果上面两个式子均大于 k,就说明 fruits[left][0] 太远了,需要增加 left。
21+
22+
# 对于 right,它必须小于 n,且满足
23+
24+
# fruits[right][0]≤startPos+k
25+
# 移动 left 和 right 的同时,维护窗口内的水果数量 s,同时用 s 更新答案的最大值。
26+
27+
class Solution:
28+
def maxTotalFruits(self, fruits: List[List[int]], startPos: int, k: int) -> int:
29+
left = bisect_left(fruits, [startPos - k]) # 向左最远能到 fruits[left][0]
30+
right = bisect_left(fruits, [startPos + 1]) # startPos 右边最近水果(因为下面求的是左闭右开区间)
31+
ans = s = sum(c for _, c in fruits[left:right]) # 从 fruits[left][0] 到 startPos 的水果数
32+
while right < len(fruits) and fruits[right][0] <= startPos + k:
33+
s += fruits[right][1] # 枚举最右位置为 fruits[right][0]
34+
while fruits[right][0] * 2 - fruits[left][0] - startPos > k and \
35+
fruits[right][0] - fruits[left][0] * 2 + startPos > k:
36+
s -= fruits[left][1] # fruits[left][0] 无法到达
37+
left += 1
38+
ans = max(ans, s) # 更新答案最大值
39+
right += 1 # 继续枚举下一个最右位置
40+
return ans
41+
42+
# 作者:灵茶山艾府
43+
# 链接:https://leetcode.cn/problems/maximum-fruits-harvested-after-at-most-k-steps/solutions/2254860/hua-dong-chuang-kou-jian-ji-xie-fa-pytho-1c2d/
44+
# 来源:力扣(LeetCode)
45+
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 commit comments

Comments
 (0)