135. Candy
В очереди стоят n детей. Каждому ребенку присвоено значение рейтинга, указанное в mảngе целых чисел ratings.
Вы раздаете конфеты этим детям с соблюдением следующих требований:
Каждый ребенок должен получить как минимум одну конфету.
Дети с более высоким рейтингом должны получать больше конфет, чем их соседи.
return минимальное количество конфет, которое вам нужно иметь, чтобы распределить их среди детей.
Ví dụ:
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# lời giải
đã khớp/gốcpublic 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++ lời giải
bản nháp tự động, xem lại trước khi gửi#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 lời giải
đã khớp/gốcpublic 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 lời giải
đã khớp/gốcvar 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 lời giải
đã khớp/gốcclass 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 lời giải
đã khớp/gốcfunc 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️⃣
Инициализация и первичное заполнение mảngов:
Создайте два mảngа: left2right для расчета конфет с учетом только левых соседей и right2left для расчета с учетом только правых соседей. Изначально каждому ученику в обоих mảngах присваивается по одной конфете.
2️⃣
Обход и обновление значений в mảngах:
Проходите mảng ratings слева направо, увеличивая значение в left2right для каждого ученика, чей рейтинг выше рейтинга его левого соседа.
Затем проходите mảng справа налево, увеличивая значение в right2left для каждого ученика, чей рейтинг выше рейтинга его правого соседа.
3️⃣
Расчет минимального количества конфет:
Для каждого ученика определите максимальное значение конфет между left2right[i] и right2left[i], чтобы соответствовать требованиям к распределению конфет.
Суммируйте полученные значения для всех учеников, чтобы find минимальное количество конфет, необходимое для соблюдения всех правил.
😎
Vacancies for this task
việc làm đang hoạt động with overlapping task tags are đã hiển thị.