Drill

ProblemsGo › games

Distribute candies by rating

hardgamesGreedyArraysGo

Children stand in a line, each with a rating. Every child must get at least one candy, and a child with a strictly higher rating than a neighbour must get strictly more candies than that neighbour.

candyRating(ratings: list<int>) → int

Go needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.

Solve it in Python →

Where you start

func candyRating(ratings []int) int {
	
}

Worked examples

CallResult
candyRating([]int{1, 2, 2})4
candyRating([]int{2, 1, 2})5
candyRating([]int{1, 3, 2, 2, 1})7
candyRating([]int{3, 2, 1})6

Hint

Two passes: left-to-right to handle increases from the left, then right-to-left to handle increases from the right.

Reference solution in Go
func candyRating(ratings []int) int {
	n := len(ratings)
	if n == 0 {
		return 0
	}
	candies := make([]int, n)
	for i := range candies {
		candies[i] = 1
	}
	for i := 1; i < n; i++ {
		if ratings[i] > ratings[i-1] {
			candies[i] = candies[i-1] + 1
		}
	}
	for i := n - 2; i >= 0; i-- {
		if ratings[i] > ratings[i+1] && candies[i] <= candies[i+1] {
			candies[i] = candies[i+1] + 1
		}
	}
	total := 0
	for _, c := range candies {
		total += c
	}
	return total
}

The same problem in another language

More games problems in Go