本文共 1866 字,大约阅读时间需要 6 分钟。
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements: Each child must have at least one candy. Children with a higher rating get more candies than their neighbors. What is the minimum candies you must give?多个小朋友站成一排,根据他们的得分分发糖果,得分高的小朋友要比旁边得分低的小朋友得到的糖果多,每个小朋友至少得到一枚糖果,问最少要准备多少糖果?
太简单了, 略,时间复杂度是(O(2*n)=On)。空间上需要一个长度为n的数组,复杂度是O(n)。但是上次字节跳动版的改编题目不简单,他的小朋友不是站成一排而是一圈。有时间我会把这道题加到下面, tag
class Solution: def candy(self, ratings): n = len(ratings) # print(n) res = n * [1] for i in range(1, n): # print(i) if ratings[i] > ratings[i - 1]: res[i] = res[i-1] + 1 print(res) for j in range(n-2, -1, -1): # print(i) if ratings[j] > ratings[j+1]: res[j] = max(res[j+1] + 1, res[j]) print(res) return sum(res)if __name__ == '__main__': # a = [1, 2, 5, 5, 10] # a = [1, 2] a = [1, 0, 2] so = Solution() print(so.candy(a))
多个小朋友站成一圈(第一个和第n个相连),根据他们的得分分发糖果,得分高的小朋友要比旁边得分低的小朋友得到的糖果多,每个小朋友至少得到一枚糖果,问最少要准备多少糖果?
其实也不难,就多一个开环的过程,但是当时脑袋短路了,写了一个小时
class Solution: def candy(self, values, a): # 开环 ratings = values + values n = 2 * a res = n * [1] for i in range(1, n): if ratings[i] > ratings[i - 1]: res[i] = res[i-1] + 1 for j in range(n-2, -1, -1): if ratings[j] > ratings[j+1]: res[j] = max(res[j+1] + 1, res[j]) for i in range(a): res[i] = max(res[i], res[i+a]) res = res[:a] return sum(res)if __name__ == '__main__': # a = [1, 2, 5, 7, 10] # a = [1, 2, 5, 5, 10] # a = [1, 2] a = [1, 2, 3, 3] so = Solution() print(so.candy(a, len(a)))
转载地址:http://oejmb.baihongyu.com/