135. Candy

LeetCode hard original: C# #array #csharp #hard #leetcode #math #queue #two-pointers
题目文本会按所选界面语言从俄语翻译;代码保持不变。

В очереди стоят n детей. Каждому ребенку присвоено значение рейтинга, указанное в 数组е целых чисел ratings.

Вы раздаете конфеты этим детям с соблюдением следующих требований:

Каждый ребенок должен получить как минимум одну конфету.

Дети с более высоким рейтингом должны получать больше конфет, чем их соседи.

return минимальное количество конфет, которое вам нужно иметь, чтобы распределить их среди детей.

示例:

Input: ratings = [1,0,2]

Output: 5

Explanation: You can allocate to the first, second and third child with 2, 1, 2 candies respectively.

C# 解法

匹配/原始
public class Solution {
    public int Candy(int[] ratings) {
        int sum = 0;
        int length = ratings.Length;
        int[] left2right = Enumerable.Repeat(1, length).ToArray();
        int[] right2left = Enumerable.Repeat(1, length).ToArray();
        for (int i = 1; i < length; i++) {
            if (ratings[i] > ratings[i - 1]) {
                left2right[i] = left2right[i - 1] + 1;
            }
        }
        for (int i = length - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                right2left[i] = right2left[i + 1] + 1;
            }
        }
        for (int i = 0; i < length; i++) {
            sum += Math.Max(left2right[i], right2left[i]);
        }
        return sum;
    }
}

C++ 解法

自动草稿,提交前请检查
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int Candy(vector<int>& ratings) {
        int sum = 0;
        int length = ratings.size();
        vector<int>& left2right = Enumerable.Repeat(1, length).ToArray();
        vector<int>& right2left = Enumerable.Repeat(1, length).ToArray();
        for (int i = 1; i < length; i++) {
            if (ratings[i] > ratings[i - 1]) {
                left2right[i] = left2right[i - 1] + 1;
            }
        }
        for (int i = length - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                right2left[i] = right2left[i + 1] + 1;
            }
        }
        for (int i = 0; i < length; i++) {
            sum += max(left2right[i], right2left[i]);
        }
        return sum;
    }
}

Java 解法

匹配/原始
public class Solution {
    public int candy(int[] ratings) {
        int sum = 0;
        int[] left2right = new int[ratings.length];
        int[] right2left = new int[ratings.length];
        Arrays.fill(left2right, 1);
        Arrays.fill(right2left, 1);
        for (int i = 1; i < ratings.length; i++) {
            if (ratings[i] > ratings[i - 1]) {
                left2right[i] = left2right[i - 1] + 1;
            }
        }
        for (int i = ratings.length - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1]) {
                right2left[i] = right2left[i + 1] + 1;
            }
        }
        for (int i = 0; i < ratings.length; i++) {
            sum += Math.max(left2right[i], right2left[i]);
        }
        return sum;
    }
}

JavaScript 解法

匹配/原始
var candy = function (ratings) {
    var sum = 0;
    var len = ratings.length;
    var left2right = new Array(len).fill(1);
    var right2left = new Array(len).fill(1);
    for (var i = 1; i < len; i++) {
        if (ratings[i] > ratings[i - 1]) {
            left2right[i] = left2right[i - 1] + 1;
        }
    }
    for (var i = len - 2; i >= 0; i--) {
        if (ratings[i] > ratings[i + 1]) {
            right2left[i] = right2left[i + 1] + 1;
        }
    }
    for (var i = 0; i < len; i++) {
        sum += Math.max(left2right[i], right2left[i]);
    }
    return sum;
};

Python 解法

匹配/原始
class Solution:
    def candy(self, ratings: List[int]) -> int:
        sum = 0
        n = len(ratings)
        left2right = [1] * n
        right2left = [1] * n
        for i in range(1, n):
            if ratings[i] > ratings[i - 1]:
                left2right[i] = left2right[i - 1] + 1
        for i in range(n - 2, -1, -1):
            if ratings[i] > ratings[i + 1]:
                right2left[i] = right2left[i + 1] + 1
        for i in range(n):
            sum += max(left2right[i], right2left[i])
        return sum

Go 解法

匹配/原始
func candy(ratings []int) int {
    sum := 0
    n := len(ratings)
    left2right := make([]int, n)
    right2left := make([]int, n)
    for i := range left2right {
        left2right[i] = 1
    }
    for i := range right2left {
        right2left[i] = 1
    }
    for i := 1; i < n; i++ {
        if ratings[i] > ratings[i-1] {
            left2right[i] = left2right[i-1] + 1
        }
    }
    for i := n - 2; i >= 0; i-- {
        if ratings[i] > ratings[i+1] {
            right2left[i] = right2left[i+1] + 1
        }
    }
    for i := 0; i < n; i++ {
        sum += max(left2right[i], right2left[i])
    }
    return sum
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

Algorithm

1️⃣

Инициализация и первичное заполнение 数组ов:

Создайте два 数组а: left2right для расчета конфет с учетом только левых соседей и right2left для расчета с учетом только правых соседей. Изначально каждому ученику в обоих 数组ах присваивается по одной конфете.

2️⃣

Обход и обновление значений в 数组ах:

Проходите 数组 ratings слева направо, увеличивая значение в left2right для каждого ученика, чей рейтинг выше рейтинга его левого соседа.

Затем проходите 数组 справа налево, увеличивая значение в right2left для каждого ученика, чей рейтинг выше рейтинга его правого соседа.

3️⃣

Расчет минимального количества конфет:

Для каждого ученика определите максимальное значение конфет между left2right[i] и right2left[i], чтобы соответствовать требованиям к распределению конфет.

Суммируйте полученные значения для всех учеников, чтобы find минимальное количество конфет, необходимое для соблюдения всех правил.

😎

Vacancies for this task

活跃职位 with overlapping task tags are 已显示.

所有职位
目前还没有活跃职位。