当前位置: 首页 > 知识库问答 >
问题:

LeetCode问题135糖果一次求解法求给每个孩子的糖果数量

令狐宏伟
2023-03-14

problem(https://leetcode.com/problems/candy/description/)语句如下:

有N个孩子站成一排。为每个子级分配一个评等值。您给这些符合以下要求的儿童糖果:

而只给出糖果的总数。我希望修改解决方案,以输出给每个孩子的糖果数量。我的尝试如下:

class Solution:
    def candy(self, ratings: List[int]) -> int:
        if not ratings: return 0
        n = len(ratings)
        res = [1]*n   # minimum 1 for each
        i = 1
        while i < n:
            if ratings[i-1] > ratings[i]:
                # check whether needed to add candy to current child 
                # based on right neighbor
                r = i   
                while r < n and ratings[r-1] > ratings[r]:
                    for j in range(i, r): res[j-1] += 1
                i = r
            else:
                # add candy to current child based on left neighbor
                if ratings[i-1] < ratings[i] and res[i-1] >= res[i]: res[i] = res[i-1] + 1
                i += 1
        print(res)

有人能帮我排除故障或提供一个一次性解决方案吗?

共有1个答案

司马璞
2023-03-14

这是一个一次性解决方案,显示了分配给每个孩子的糖果。

def candy(ratings):
  n = len(ratings)

  # Start off giving every child one candy
  # c is array of candies
  # desc_buf is the sequence of immediately preceding rating descents
  c, desc_buf = [1]*n, []

  curr_prev_pairs = list(zip(ratings[1:], ratings))
  for i, (curr, prev) in enumerate(curr_prev_pairs, start=1):
    if curr < prev:
      # rating less than previous
      if not desc_buf:
        # start new descent sequence
        desc_buf = [i-1]
      desc_buf.append(i)
      if i != n-1:
        continue

    if curr > prev:
      # increasing rating
      c[i] = c[i-1] + 1

    if desc_buf:
      for extra, idx in enumerate(desc_buf[::-1]):
        c[idx] = max(c[idx], extra + 1)
      del desc_buf[:]

  return c

ratings = [1, 0, 2]
print(candy(ratings))    # [2, 1, 2] (5 total)

ratings = [1, 2, 2]
print(candy(ratings))    # [1, 2, 1] (4 total)
 类似资料:
  • leetcode糖果问题,这种做法为什么可行? leetcode糖果问题 这个官方题解并没有证明,只是说了一下过程。我有以下几点疑问: left[..]是在仅符合左规则下分的糖果最少的分配方案吗?同样的right[...]是在仅符合右规则下分的糖果最少的分配方案吗? 为什么取仅符合左规则的值和仅符合右规则的值的最大值可以同时符合左右规则呢? 就算符合左右规则,为什么这种方案下分的糖果是最少的呢?

  • 在输出的唯一一行上,打印一个整数,描述Alice必须给出的糖果的最小数量。 爱丽丝必须给的糖果数是1、2和1。 且每个子级的分级不大于10^5。

  • 在一个圆圈中有个孩子。他们每个人都有一些糖果(可能是负的、正的或零的)。他们可以一次给邻居一颗糖。最终的结果是,他们都应该有零糖果在最小的步骤。 假设我们有4个带有糖果的孩子,那么序列将是 (-3,-2,4,1) (-2,-2,4,0) (-2,-1,3,0) (-2,0,2,0) (-2,1,1,0) (-2,2,0,0) (-1,1,0,0) (0,0,0,0) 等等。 我的解决方案的复杂性导

  • Java 的语法比 C/C++ 友好很多, 因为它设计之初,就是为了考虑到程序员的使用是否舒适。 当然很多事情愿望是美好的,现实是残酷的。Java 语言本身的语法仍然不可避免的带有着 10年前那种 的僵硬和严谨。这里是一些小小的尝试,你会发现,大多数情况,通过一些静态函数,一行代码完全 可以做很多事情, 而且比“甜甜”的 Ruby 也差不了太多。 你可以查看 org.nutz.lang Git@O

  • 我已经成功排序按照执行, 如果“类别”字段等于,则比较“排序”字段,如果“类别”字段不等于,则比较“id”字段。 我想用java8list.stream(). sorted做上面的代码一样。可以吗? 如果“category”字段不等于,则无法比较“id”字段。

  • 我是新来的javascript/玉。我正试图创建一个简单的例子,在一个玉模板文件中使用甜言蜜语2。当我运行以下内容时,我会收到“帮助我”警报,但当我到达swal线时,我会收到: ReferenceError:未定义swal 应该注意的是,我是在一个基于express/node.js的玩具应用程序中运行它的。通过从代码中复制位置并将它们插入浏览器上的另一个选项卡,我已经验证了sweetalert2.