LeetCode 筆記 - 135. Candy

題目在此 135. Candy

給一個數列,代表一系列小孩的排名,有以下規則

  • 每個小孩至少一顆糖果
  • 如果小孩對他的鄰居有更高的排名,必須比他的鄰居拿更多的糖果

請計算最少可以給幾顆?

解題思維

這題是一題 Hard problem,但解題思緒雖然崎嶇了點,但沒有太複雜

依正常情況,糖果的分佈勢必會呈現一個山形,而山頂的數量必定是由左邊或右邊的山決定的
這裡有一點可以注意的是左邊山坡跟右邊的山坡是獨立沒有關係的

因此我們可以分開計算左右山坡,最後在計算山頂的數字即可 max(左邊, 右邊)

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution:
def candy(self, ratings: List[int]) -> int:

if (size := len(ratings)) == 1:
return 1

left_right = [1] * size
right_left = [1] * size

for i in range(1, size):
if ratings[i - 1] < ratings[i]:
left_right[i] = left_right[i - 1] + 1

for i in reversed(range(size - 1)):
if ratings[i] > ratings[i + 1]:
right_left[i] = right_left[i + 1] + 1

result = sum([max(left_right[i], right_left[i]) for i in range(size)])

return result

也許你也會想看看